我試圖很難找到這個問題的答案,所以如果它已被問到,也許我寫錯了。我有一個抽象基類和派生類。在實現一個抽象基類作爲參數的接口方法時訪問派生類屬性
abstract class Foo
{
protected int property1
protected int property2
// etc..
}
我dervied類包含未在基類中發現了一些額外的屬性:
class Fum : Foo
{
public int UniqueProperty { get; set; }
}
現在我有,是以抽象基類中的方法的接口:
interface IDoSomethingWithFoos
{
void DoSomethingWithFoo(Foo fooey);
}
實現接口的類
class FumLover : IDoSomethingWithFoos
{
void DoSomethingWithFoo(Foo fooey)
{
// now in here i know i am going to be passed objects of Fum
// and i want to access its unique properties
fooey.UniqueProperty = 1; // this doesn't work
((Fum)fooey).UniqueProperty = 1; // this seems to work
// as does..
Fum refToFum = fooey as Fum;
refToFum.UniqueProperty = 1;
}
}
所以我的問題是:我正在以正確的方式來解決這個問題嗎?雖然這樣編譯,但我沒有足夠的代碼來確保它實際上能夠正常工作。而我的另一個問題是:這是不好的設計?有沒有更好的辦法?
*
更詳細地說明了一點,因爲自然的反應是,如果你將要路過FUM,然後讓接口方法採取FUM,而不是一個Foo的。
但是,讓我們說在我的FumLover類中,方法DoSomethingWithFoo使用屬於抽象低音類中的屬性處理95%。假設我有另一個名爲Fie的派生類,它有幾個獨特的屬性。現在假設我有一個FieLover類,並且我想實現DoSomethingWithFoo,因爲我在這裏要做的95%可以適用於所有Foo,但是再次,Fie有一點獨特之處。
什麼是替代方案?爲每個人提供一個接口:IDoSomethingWithFums,IDoSomethingWithFies等?看起來像是我失去了5%差異的所有抽象。
嗯,但糾正我,如果我錯了,但由於接口需要一個抽象類,它總是要在派生類的實例(無論是Fum或其他類)。從抽象類派生一個類如果不是爲它添加一些獨特的屬性又有什麼意義?這幾乎就像界面所說:「我必須與這個抽象基類的派生類一起工作,但不能與它們的任何獨特方面一起工作」。 – suite16
這是真的,但通常當你有一個方法接受一個派生類型較少的版本時,你期望它能夠完成它的工作,而不需要訪問更多的派生屬性。這並非總是如此(通常當你暴露一個API時),但往往是這樣。我的意思是,如果你的實現*需要來自派生類型的*信息,那麼聲明這樣的參數可能會有幫助。正如我上面所說的,如果你不關心(這很好),至少使用'as'選項,所以你不會拋出不必要的異常。 – dlev
@ suite16這是_is_接口說的(種類)。每個派生類可以有不同的方式,但是一旦你必須知道某個實現獨有的屬性或方法,你就失去了首先使用基類的好處。 –