不知道這是否是你想要的,但嘗試從派生的子類的公有接口方法分離基類(隱藏)執行。
abstract class Disk //base class
{
protected Disk CreateRMA()
{
Disk newDisk;
newDisk = new RMAService.Exchange(this);
...whatever else needs to be done...
return newDisk;
}
}
class HDD: Disk
{
public HDD RMA()
{
return CreateRMA();
}
}
class SSD: Disk
{
public SSD RMA()
{
return CreateRMA();
}
}
每個派生類的RMA()
方法僅調用基類的CreateRMA()
方法,然後注塑所得Disk
對象派生類型。每個返回的值都有適當的子類型,並且每個RMA()
方法的所有實際工作都在基類方法中完成。現在
你能做到這些:
HDD disk1 = someHDD.RMA();
SSD disk2 = someSSD.RMA();
附錄
這不能解決OP的問題,因爲調用RMAService.Exchange()
應具體到(重載)每個派生亞型。一種不同的方法保持在派生類型方法調用,但允許基類做的所有一切的是需要初始化工作,其餘的:
// Second approach
abstract class Disk //base class
{
protected Disk CreateRMA(Disk newDisk)
{
...other initialization code...
return newDisk;
}
public abstract Disk RMA(); //not sure if this works
}
class HDD: Disk
{
public override HDD RMA()
{
return CreateRMA(new RMAService.Exchange(this));
}
}
class SSD: Disk
{
public override SSD RMA()
{
return CreateRMA(new RMAService.Exchange(this));
}
}
這對派生類多一點的工作,但只用於超載的new
調用;所有其餘的初始化代碼都保存在基類方法中。
投降
好吧,這將不能工作,因爲C#不支持covariant return types。
如果我只能在我的日常工作中使用「我很難知道如何使用類型」這個藉口:( –
這可以通過提供'交換'功能來改進。它應該被拆分 - 因爲類型的無知部分留在基類中,並且嚴格類型的部分被子類化,或者可能引入類似於'克隆'的東西。很難說不知道'Exchange'裏面有什麼 – BartoszKP
@ BartoszKP'Exchange'是任何函數,它返回一個與傳入的類型相同的運行時類型的新對象。如果您想要模擬某個東西,只需編寫一個函數,該函數返回傳入的對象。Public T Exchange( T in){return in;}' –
Alain