我有一个基类:
interface IBaseClass{
int x;
int y;
baseClass someMethod();
}
和一些派生类:
class dClass1 : IBaseClass {
int x;
int y;
baseClass someMethod();
}
class dClass2 : IBaseClass {
int x;
int y;
baseClass someMethod();
}
子类算法的属性值与其他子类不同 现在我想将这些子类转换给它们:
dClass1 c1=new dClass1 ();
c1.x=4;
c1.y=5;
dClass2 c2=c1;//cast to dClass2 , but value of property set by according to the own algorithm
Console.WriteLine("{0}, {1}", c1.x, c1.y);//4,5
Console.WriteLine("{0}, {1}", c2.x, c2.y);//7,1
最佳答案
首先,让我们明确一点,IBaseClass
不是基类,而是一个接口(interface)
,这是完全不同的东西。指出差异不在本答案的范围内,但您可以轻松阅读它,从 here 开始.
也就是说,正如其他人所说,你不能直接做你想做的事。考虑典型的例子 IAnimal
、Dog
、Cat
等。每只狗和每只猫都是动物,但猫不是狗,狗也不是猫,你基本上是在要求猫成为狗;你首先需要教猫如何狗化(它们不会为你做这些事情)。
为了实现此行为,您可以通过多种方法来实现:
用户定义的转换:您可以定义从一个类转换为另一类的运算符。如果你让它们
隐式
,你甚至可以让你的代码按现在的样子进行编译: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.
请注意,如果您要显式地实现强制转换运算符,则前面的代码将无法编译。您需要显式转换
c1
:var c2 = (dClass2)c1;
定义一个采用
dClass1
参数的dClass2
构造函数: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);
- 还有很多我懒得去想...
您选择哪一个取决于个人喜好。我可能会使用显式强制转换,但任何可用选项都没有本质上的错误。
关于c# - 将派生类转换为 C# 中的另一个派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795885/