我有幾個類從我希望更改屬性和方法的實現的基類繼承。我還要求基類和所有子類都是多態的,所以我以後可以創建一個實現特定接口的任何類型的集合。什麼是適當的方式來改變子類的屬性訪問器,同時保持多態?
當我創建實現接口的類的實例時,我想使用該類(由接口實現)而不是基類的屬性和方法。
這是我的簡單實現,它提供了所需的輸出,但確實有一個代碼的氣味問題的...
class Program
{
static void Main(string[] args)
{
IGrid one = new TextField();
IGrid two = new SelectList();
one.Click();
two.Click();
Console.WriteLine(one.Text);
Console.WriteLine(two.Text);
Console.ReadLine();
}
}
public interface IGrid {
string Text { get; set; }
void Click();
}
public class Control : IGrid {
public string Text {
get { return "Hello Control!"; }
set { }
}
public virtual void Click() {
Console.WriteLine("In the Control!");
}
}
public class SelectList : Control, IGrid {
public int Number { get; set; }
public new string Text {
get {
return "Hello Select!";
}
set { Number = int.Parse(value); }
}
public override void Click() {
Console.WriteLine("In the Select!");
}
}
public class TextField : Control, IGrid {
public int Number { get; set; }
public new string Text {
get {
return "Hello TextField!";
}
set { Number = int.Parse(value); }
}
public override void Click()
{
Console.WriteLine("In the TextField!");
}
}
這工作,但感覺有點凌亂其在控制類空集。
是否有一種更清晰的方法來解決這類問題而不影響子類上的特定屬性實現?
非常感謝,
恕我直言,如果你不打算實現一個接口,那麼不要假裝實現一個接口。對你的班級的最終用戶有一些同情心。另外,你的例子對我來說沒有意義,1.如果有人試圖將字符串Text屬性設置爲非整數值,則會拋出異常,並且2.不改變Text屬性當有人設置它。你有更現實的例子嗎?完全不清楚爲什麼你想要這樣做,而不是僅僅使用附加屬性創建新界面。 –
嗨Rufus。對不起,現在還不清楚。我還在學習。最終,我想最終得到類似'List GridItems'的東西,然後就可以添加不同類型的網格項目,比如'SelectList'和'TextField'。我希望能夠訪問這些類的方法和屬性的特定實現,而不是任何基類。看起來很奇怪的'set'評估者只是表明我想要改變子類的實現。正如我所說,方法可能是完全錯誤的,我願意提供更好的建議。謝謝, –
Konzy262