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

时间:2016-08-05 18:41:23

标签: c# oop inheritance interface polymorphism

我有一个基类:

al

和一些派生类:

List

根据子类算法的属性值与其他子类不同 现在我想将这些子类转换为它们:

interface IBaseClass{
     int x;
     int y;
     baseClass someMethod();
}

3 个答案:

答案 0 :(得分:2)

dClass1dClass2 两种不同类型。你不能直接把一个投射到另一个。你必须将一个转换为另一个。例如:

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开始轻松阅读。

那说,正如其他人所说,你不能直接做你想做的事。考虑规范示例IAnimalDogCat等.Evey狗和每只猫都是动物,但猫不是狗,狗不是猫,你基本上是要猫来是一只狗;你首先需要教猫如何进行狗化(他们不会为你开箱即用)。

为了实现这种行为,有很多方法可以做到:

  1. 用户定义的强制转换:您可以定义从一个类转换为另一个类的运算符。如果你创建它们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;
    
  2. 定义一个带有dClass2参数的dClass1构造函数:

    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. 我还没有多想过......
  5. 您选择哪一个取决于个人品味。我可能会使用显式强制转换,但任何可用选项都没有任何内在错误。

答案 2 :(得分:0)

你想要做的是不可能的。您可以将对象强制转换为较少(或在某些情况下)的派生类型,但除非在类型上定义自定义强制转换,否则无法将对象强制转换为其他类型。

您可以在此处阅读有关定义自定义投射的信息:https://msdn.microsoft.com/en-us/library/ms173105.aspx