[英]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
dClass1
和dClass2
是兩種不同的類型 。 您不能直接將一個投向另一個。 您必須將一個轉換為另一個。 例如:
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
,這是完全不同的。 指出不同之處不在此答案的范圍內,但是您可以從此處輕松了解。
就是說,正如其他人所說,您不能直接做您想做的事。 考慮一下典型的示例IAnimal
, Dog
, Cat
等。Evey狗和每只貓都是動物,但是貓不是狗,而狗不是貓,並且您基本上是在要求貓是狗。 您首先需要教貓如何進行狗狗化(它們不會為您開箱即用)。
為了實現此行為,有很多方法可以實現:
用戶定義的轉換:您可以定義從一個類轉換為另一個類的運算符。 如果使它們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;
定義一個dClass2
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);
您選擇哪一個取決於個人喜好。 我可能會使用顯式強制轉換,但是任何可用的選項都沒有固有的錯誤。
您嘗試做的事是不可能的。 您可以將對象轉換為較少(或在某些情況下為更多)的派生類型,但除非將自定義轉換定義為該類型,否則不能將對象轉換為其他類型。
您可以在此處閱讀有關定義自定義強制類型轉換的信息: https : //msdn.microsoft.com/zh-cn/library/ms173105.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.