C#下投问题

C#下投问题,c#,polymorphism,downcast,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 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);

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


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

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


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

不,这是不合法的。
Cat
动物
,但
动物
不一定是
Cat
(在您的示例中,将
A
替换为
Cat
,将
B
替换为
Animal

组合可能没有意义,正如
Cat
Animal
示例再次显示的那样。构图通常用于“有a”关系,而
动物
没有


什么模式适用于您的具体案例取决于您所在领域的具体类型。

不,这是不合法的。
Cat
动物
,但
动物
不一定是
Cat
(在您的示例中,将
A
替换为
Cat
,将
B
替换为
Animal

组合可能没有意义,正如
Cat
Animal
示例再次显示的那样。构图通常用于“有a”关系,而
动物
没有


什么模式适用于您的具体案例取决于您所在领域的具体类型。

挑剔:任何给定的
动物
可能不是
。它也可能是一只猫@cdhowie:谢谢!挑剔:任何给定的
动物
都可能不是
。它也可能是一只猫@cdhowie:谢谢!我将代码解释为失败,因为B不是A,所以在第一种情况下,强制转换是不可能的。“我是不是走错了路?”蒂姆:一点也不。这和我说的一样,只是用了不同的词。:)谢谢你的回答。我真正的问题是,我正在创建自定义标识,它应该实现IIdentity并包含关于用户的额外有用信息。我只是想避免聚合。@a1ex07:我明白了。是的,如果你有一个已经存在的对象,并且对它的创建没有控制权,你想在它上面加一个接口,那么聚合是你唯一的选择。哈,漫长的第8天{谢谢@cdhowieI将代码解释为失败,因为B不是A,所以在第一种情况下不可能进行转换。我是不是走错了方向?@Tim:一点也不。这和我说的一样,只是用了不同的词。:)谢谢你的回答。我真正的问题是,我正在创建自定义标识,它应该实现IIdentity和con输入关于用户的额外有用信息。我只是试图避免聚合。@a1ex07:我明白了。是的,如果您有一个现有对象,并且无法控制其创建,并且您想在其上附加一个接口,聚合实际上是您唯一的选择。哈,漫长的一天8{谢谢@cdhowie