簡體   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