2010-01-13 39 views
3

比方说,我有2个班是这样的:C#继承(一种关闭)/使用多类的特性在一个类

public class A 
{ 
    public string P1{ get; set; } 
    public string P2{ get; set; } 
} 

public class B 
{ 
    public string P3{ get; set; } 
    public string P4{ get; set; } 
} 

,我需要这样一个类:

public class C 
{ 
    public string P1{ get; set; } 
    public string P2{ get; set; } 
    public string P3{ get; set; } 
    public string P4{ get; set; } 
} 

它有可能为类C使用类A和B而不是重新声明所有属性?
(我需要DTO)

回答

2

你不能,多重继承只适用于在C#中的接口。

黑客

我:

public class C : { public A; public B; } 

II:

public interface IA { string P1, P2; }  
public interface IB { string P3, P4; } 

public class C : IA, IB { string P1, P2, P3, P4; } 

III:

public class A { public string P1, P2; } 
public class B : A { public string P3, P4; } 

public class C : B {} 

对于DTO,也许这些链接1; 2可能是有用的:

如果不是,您可以使用反射动态构建您的类。

Build dynamically新的C类包含AB的所有公共属性。

7

不,C#不支持多重继承。它可以使用A或B,而不是两者。

这是可行的,但也许并不漂亮:

public class C 

{

public A APart { get; set; }

public B BPart { get; set; }

}

0

除非你做B继承自A,然后让C继承自B

0

不,解决方案是使用接口。取消多重继承,它不会给你实现的自动性,但它确实提供了多态性和编译时间类型的安全性。

2

您可以定义A和B都实现的接口IA和IB以及C实现的接口。该领域仍需要在C中声明,但他们在编译时进行检查,以确保与校验和B.

interface IA { 
    string P1; 
    string P2; 
} 

interface IB { 
    string P3; 
    string P4; 
} 

class A : IA { 
    string P1 { get; set; } 
    string P2 { get; set; } 
} 

class B : IB { 
    string P3 { get; set; } 
    string P4 { get; set; } 
} 

class C : IA, IB { 
    string P1 { get; set; } 
    string P2 { get; set; } 
    string P3 { get; set; } 
    string P4 { get; set; } 
} 
+2

我需要这个来优化DTO的构建,这样对于一些具有一些共同属性的DTO来说,不需要在所有其他DTO中重新声明它们,所以这不是我所需要的 – Omu 2010-01-13 10:49:04

1

你怎么样结合上面的答案:

interface IA { 
    string P1; 
    string P2; 
} 

interface IB { 
    string P3; 
    string P4; 
} 

class A : IA { 
    string P1 { get; set; } 
    string P2 { get; set; } 
} 

class B : IB { 
    string P3 { get; set; } 
    string P4 { get; set; } 
} 

class C : IA, IB { 
    private IA a; 
    private IB b; 
    string P1 { get { return a.P1; } set { a.P1 = value } } 
    string P2 { get { return a.P2; } set { a.P2 = value } } 
    string P3 { get { return b.P3; } set { b.P3 = value } } 
    string P4 { get { return b.P4; } set { b.P4 = value } } 
} 

不是超级靓否则容易产生,但应保留数据的所有权和阶级关系。