C#转发问题

时间:2010-12-15 18:19:15

标签: c# polymorphism downcast

在以下情况下是否有效且合法:

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);

2 个答案:

答案 0 :(得分:2)

第一个例子不起作用,因为A是-a B;类型B 的实例可能是A,但在您的情况下则不是。转换将失败,您将在运行时获得InvalidCastException。

第二个例子将起作用,因为它将按预期编译和执行。但是,如果不了解有关您实际问题的更多细节(不是模拟问题),我无法告诉您这是否是正确的模式。

答案 1 :(得分:1)

不,这不合法。 CatAnimalAnimal不一定是CatA替换CatB替换Animal在你的例子中{1}}。

组合可能没有意义,因为CatAnimal示例再次显示。作文通常用于“有”关系,Animal没有Cat

哪种模式适用于您的具体案例取决于您域中的具体类型。