问题描述
|
public class a{
public string x1 {get;set;}
public string x2 {get;set;}
public string x3 {get;set;}
}
public class b:a{
}
显然,“ 1”会在运行时引发转换错误。
我认为分配已实例化并填充的2的所有属性的唯一另一种方法是将每个属性手动复制到3的新实例中。
它是否正确?
解决方法
这种类型的投射是错误的,因为您无法将父母投射给他们的孩子。
a
的类型不知道b
的元信息。因此,您需要提供显式的强制转换运算符来执行此类操作,但是在这种情况下,您必须删除继承。
另一种选择是定义一些接口,例如在其他问题中。
更多信息:
http://msdn.microsoft.com/en-us/library/ms173105.aspx
http://msdn.microsoft.com/zh-CN/library/85w54y0a.aspx
, 不可能。即使您认为自己拥有它,编译器也会抱怨。
这通常表示设计或逻辑错误。
, 这件事也一直困扰着我。
我通过创建自己的Up-Casting实用程序制定了解决方案。
您可以在此处阅读我的文章,该文章实际上是非常简单的。
http://sympletech.com/c-up-casting-utility/
, 您实际上正在寻找的实际上是DOWNCAST,而不是Upcast。为此,我们假设您有一个对象对象,例如ObjA。现在创建一个对象ObjNewA,执行以下操作:
b new_ObjNewA = ObjA as b;
上面的代码应该工作100%
可以这样认为:ClassName NewObject = OldObject as ClassName;
其中的类名是继承的类或子类。这是确保其正常工作的屏幕截图:
, 你不能做那个演员。
您可以,而且我想应该使用界面。
public interface ia
{
string x1 { get; set; }
string x2 { get; set; }
string x3 { get; set; }
}
public class a : ia
{
public string x1 { get; set; }
public string x2 { get; set; }
public string x3 { get; set; }
}
public class b : a,ia
{
}
那么你就可以
ia foo = new a();
, 实际上,创建b的新实例并将a的字段值复制到其中的想法似乎是一种有趣的方法。使用反射来实现这一点应该很合适。
诸如此类:遍历a \的所有字段,获取它们存储在a中的值,并将它们存储在b中的同一字段中。
但是,这不是“向下转换”,因为它意味着创建了完全不同的对象,而不是重新解释现有对象的含义。
, 就像每个人都说的那样,这是不可能的。隐式转换是一种解决方案,但是我更喜欢在b上创建一个构造函数,该构造函数采用a类型的实例。
这样,您可以:在内部保留对该引用的引用,并对其进行调用,以从b继承b的继承,或者只是将值复制到类型a中。