也許這是一個愚蠢的問題。但是,我不明白我缺少的重點。抽象方法被混凝土類型覆蓋
考慮下面的類定義
public abstract class AbstractBaseClass
{
public abstract void Create(AnotherAbstractClass param1);
}
Wheras AnotherAbstractClass
定義
public abstract class AnotherAbstractClass
{
}
一個具體實施
public class AnotherConcreteImplementation : AnotherAbstractClass
{
}
我希望能夠擁有的倍率Create
使用具體類型的方法:
public class ConcreteImplementation : AbstractBaseClass
{
public override void Create(AnotherConcreteImplementation param1) <-- There is no suitable method for override
{
// param1 is an instance of the concrete implementation
}
public override void Create(AnotherAbstractClass param1) <-- this is working but I'll have to cast on each implementation
{
// param1 is an instance of the abstract class and needs a cast
}
}
這是根本不可能或有某種方式我不知道?也許使用泛型?
編輯#1(增加了更多的上下文)
我試圖實現/執行,在具體實現中只有一個參數有效。 認爲它是數據庫層。 Create
方法將在數據庫中創建一個新條目。由於每個表具有不同的值,因此創建參數也具有。 可以通過AnotherAbstractClass
的任何具體實現調用裏面的氣味(在我看來)。
public class AddressTable : AbstractBaseClass
{
public override void Create(AnotherAbstractClass param1)
{
// cast to concrete instance
var casted = (ConcreteAddressCreate)param1;
}
}
public class CityTable : AbstractBaseClass
{
public override void Create(AnotherAbstractClass param1)
{
// cast to concrete instance
var casted = (ConcreteCityCreate)param1;
}
}
具有AddressTable
一個實例,我可以從另一方面調用
addressIntance.Create(new ConcreteAddressCreate()); // would be okay
我可以把它
addressIntance.Create(new ConcreteCityCreate()); // would be okay but will fail at runtime with InvalidCastException
編輯#2(附加信息)
應該也可以擴展AbstractBaseClass
稍後使用更多抽象方法的類。 因此,對於我來說,更有可能使用泛型方法而不是具體的類實現,每種方法要實現200個泛型參數。
大家笑回答您一般的代碼片段,沒有任何想法或真實意圖幫你,只是放棄一些點。基本上你問的是可能的,但它是一個巨大的代碼氣味,真正的問題是你爲什麼認爲你需要這個?你能否給我們更多的背景知識,因爲我相信有更好的課堂設計來達到你真正需要的。 – dustinmoris
@dustinmoris我不回答,只是廢了一些觀點,我有很多這樣的東西,沒有用。我只是想向OP展示一個快速使用泛型來解決這個特定問題。我確實認爲這看起來像代碼味道。 – CodeCaster
@dustinmoris這看起來不像是一種代碼味道,也沒有人會「爲點取捨」(無論如何,我總是很容易得到點數,但是我很難從中得到答案)。 –