繁体   English   中英

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

[英]Cast derived class to another derived in c#

我有一个基类:

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

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;

关键是,系统无法将一种类型直接转换为另一种类型。 您可以将此转换封装为类型或单独类上的工厂方法。 但是强制转换不是一种选择。 仅因为这两种类型具有相同类型/名称/等的成员。 不会使它们成为同一类型。

首先,让我们清楚地表明IBaseClass 不是基类,它是一个interface ,这是完全不同的。 指出不同之处不在此答案的范围内,但是您可以从此处轻松了解。

就是说,正如其他人所说,您不能直接做您想做的事。 考虑一下典型的示例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. 

    请注意,如果要以显式方式实现强制转换运算符,则先前的代码将无法编译。 您需要显式转换c1

     var c2 = (dClass2)c1; 
  2. 定义一个dClass2 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. 我没有更多的时间去思考...

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

您尝试做的事是不可能的。 您可以将对象转换为较少(或在某些情况下为更多)的派生类型,但除非将自定义转换定义为该类型,否则不能将对象转换为其他类型。

您可以在此处阅读有关定义自定义强制类型转换的信息: https : //msdn.microsoft.com/zh-cn/library/ms173105.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM