Up casting - c#
本文关键字:casting Up | 更新日期: 2023-09-27 17:59:01
public class a{
public string x1 {get;set;}
public string x2 {get;set;}
public string x3 {get;set;}
}
public class b:a{
}
显然,var foo = (b)new a();
将在运行时抛出一个强制转换错误。
我能想到的分配已经实例化和填充的a
的所有属性的唯一其他方法是手动将每个属性复制到b
的新实例中。
这是正确的吗?
这种类型的强制转换是错误的,因为不能将父母强制转换为他们的孩子
类型a
不知道类型b
的元信息。因此,您需要提供显式强制转换运算符来执行这些操作,,但在这种情况下,您必须删除继承
另一种选择是定义一些接口,例如在其他问题中。
更多信息:
http://msdn.microsoft.com/en-us/library/ms173105.aspx
http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
不可能。即使你认为你有它,编译器也会抱怨。
这通常表示设计或逻辑错误。
这件事也一直困扰着我。我通过创建自己的UpCasting实用程序找到了解决方案。
你可以在这里阅读我关于如何做到这一点的文章——实际上很简单。
http://sympletech.com/c-up-casting-utility/
您不能进行该转换。
你可以,我想你应该,使用一个界面。
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类型的实例…
通过这种方式,您可以:在内部保留对a的引用,并委托它调用b从a继承,或者只是简单地将值从类型a中复制出来。