0

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

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

2 回答 2

2

第一个例子行不通,因为 A is-a B; B 类型的实例可能是 A,但在您的情况下不是。转换将失败,您将在运行时收到 InvalidCastException。

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

于 2010-12-15T18:20:55.437 回答
1

不,这是不合法的。ACat是 anAnimal但 anAnimal不一定是 a Cat(在您的示例中替换ACatand Bby Animal)。

组合可能没有意义,正如CatAnimal示例再次显示的那样。组合通常用于“有一个”关系,而一个Animal没有一个Cat

哪种模式适用于您的特定情况取决于您的域中的具体类型。

于 2010-12-15T18:22:29.987 回答