我有一个基类:
al
和一些派生类:
List
根据子类算法的属性值与其他子类不同 现在我想将这些子类转换为它们:
interface IBaseClass{
int x;
int y;
baseClass someMethod();
}
答案 0 :(得分:2)
dClass1
和dClass2
两种不同类型。你不能直接把一个投射到另一个。你必须将一个转换为另一个。例如:
dClass1 c1 = new dClass1
{
x=4,
y=5
};
dClass2 c2 = new dClass2
{
x = c1.x,
y = c1.y
};
或者,使用与原始代码类似的多行:
dClass1 c1 = new dClass1();
c1.x=4;
c1.y=5;
dClass2 c2 = new dClass2();
c2.x = c1.x;
c2.y = c1.y;
关键是,系统无法直接将一种类型转换为另一种类型。您可以将此转换封装到任一类型的工厂方法或单独的类上。但是铸造不是一种选择。仅仅因为这两种类型具有相同类型/名称/等的成员。并不能使它们成为同一类型。
答案 1 :(得分:2)
首先,让我们明确指出IBaseClass
不是基类,它是interface
,这是完全不同的东西。指出差异不在本答案的范围内,但您可以从here开始轻松阅读。
那说,正如其他人所说,你不能直接做你想做的事。考虑规范示例IAnimal
,Dog
,Cat
等.Evey狗和每只猫都是动物,但猫不是狗,狗不是猫,你基本上是要猫来是一只狗;你首先需要教猫如何进行狗化(他们不会为你开箱即用)。
为了实现这种行为,有很多方法可以做到:
用户定义的强制转换:您可以定义从一个类转换为另一个类的运算符。如果你创建它们implicit
,你甚至可以像现在一样编译你的代码:
public static implicit operator dClass2(dClass1 obj)
{ //logic to convert obj to corresponding new dClass2 instance }
现在这是合法的:
var c1 = new dClass1();
dClass2 c2 = c1; // implicit cast operator is called.
请注意,如果要将cast运算符实现为显式,则前一代码将无法编译。您需要明确投射c1
:
var c2 = (dClass2)c1;
定义一个带有dClass2
参数的dClass1
构造函数:
public dClass2(dClass1 obj) { ... }
你会写下面的代码:
var c1 = new dClass1();
var c2 = new dClass2(c1);
在dClass2
中定义一个静态工厂方法,该方法接受dClass1
参数并生成一个新的dClass2
实例:
public static dClass2 CreateFrom(dClass1 obj) { ... }
以及相应的代码:
var c1 = new dClass1();
var c2 = dClass2.CreateFrom(c1);
您选择哪一个取决于个人品味。我可能会使用显式强制转换,但任何可用选项都没有任何内在错误。
答案 2 :(得分:0)
你想要做的是不可能的。您可以将对象强制转换为较少(或在某些情况下)的派生类型,但除非在类型上定义自定义强制转换,否则无法将对象强制转换为其他类型。
您可以在此处阅读有关定义自定义投射的信息:https://msdn.microsoft.com/en-us/library/ms173105.aspx