在以下情况下是否有效且合法:
public interface IA {
string Property1 {get;}
}
public class B {
public string Name {get;set;}
}
// class A doesn't have it's own fields, all IA methods/properties are implemented through B methods
public class A:B,IA
{
public string Property1
{
get {return this.Name}
}
}
.....
B b = new B();
A a = (A)b; // will it work ?
或者使用合成/聚合更好吗?
public class A :IA
{
private B b;
....
public string Property1 {get {return b.Name;} }
public A(B b) {this.b = b}
}
....
B b= new B();
A a = new A(b);
答案 0 :(得分:2)
第一个例子不起作用,因为A是-a B;类型B 的实例可能是A,但在您的情况下则不是。转换将失败,您将在运行时获得InvalidCastException。
第二个例子将起作用,因为它将按预期编译和执行。但是,如果不了解有关您实际问题的更多细节(不是模拟问题),我无法告诉您这是否是正确的模式。
答案 1 :(得分:1)
不,这不合法。 Cat
是Animal
但Animal
不一定是Cat
(A
替换Cat
而B
替换Animal
在你的例子中{1}}。
组合可能没有意义,因为Cat
和Animal
示例再次显示。作文通常用于“有”关系,Animal
没有Cat
。
哪种模式适用于您的具体案例取决于您域中的具体类型。