c# - 将派生类转换为 C# 中的另一个派生类

标签 c# oop inheritance interface polymorphism

我有一个基类:

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 开始.

也就是说,正如其他人所说,你不能直接做你想做的事。考虑典型的例子 IAnimalDogCat 等。每只狗和每只猫都是动物,但猫不是狗,狗也不是猫,你基本上是在要求猫成为狗;你首先需要教猫如何狗化(它们不会为你做这些事情)。

为了实现此行为,您可以通过多种方法来实现:

  1. 用户定义的转换:您可以定义从一个类转换为另一类的运算符。如果你让它们隐式,你甚至可以让你的代码按现在的样子进行编译:

    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;
    
  2. 定义一个采用 dClass1 参数的 dClass2 构造函数:

    public dClass2(dClass1 obj) { ... }
    

    然后您将编写以下代码:

    var c1 = new dClass1();
    var c2 = new dClass2(c1);
    
  3. dClass2 中定义一个静态工厂方法,该方法采用 dClass1 参数并生成一个新的 dClass2 实例:

    public static dClass2 CreateFrom(dClass1 obj) { ... }
    

    以及对应的代码:

    var c1 = new dClass1();
    var c2 = dClass2.CreateFrom(c1);
    
  4. 还有很多我懒得去想...

您选择哪一个取决于个人喜好。我可能会使用显式强制转换,但任何可用选项都没有本质上的错误。

关于c# - 将派生类转换为 C# 中的另一个派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795885/

相关文章:

c# - 无法从 DeviceInformation.Id 创建 UsbDevice

c# - 为什么 FormShown 事件不会在 C# 中触发?

c# - 单选按钮和显示

javascript - 降低 JavaScript 应用程序复杂性的最佳方法是在顶部构建/使用 OOP 框架吗?

c# - 设计游戏对象

c# - .NET 4.5 File.Copy 可以,但文件不存在

c++ - 我们为什么以及在哪里使用向下类型转换?

c++从继承链获取对外部成员的访问

javascript - 从基本提供者继承时如何防止直接访问属性?

c++ - 为什么我不能 static_cast 继承树下的模板化对象?