[英]Interface & Base Abstract Class c#
定義接口,在基本抽象類中實現接口,賦予其默認行為然后從基類繼承是一種好習慣嗎?
還是那太過分了?
使用接口還是抽象類是兩個完全不同的問題。 可能兩者的答案都是肯定的,但是一個與另一個無關。
除非您絕對確定需要多個從基類繼承並共享某些方法的類,否則我不會預先計划使用繼承。 當我們開始設想一些完美的教科書類層次結構時,它通常會變得復雜且無法解決。 當您進行重構或發現自己正在編寫類似的類並且不想重復代碼時,通常更有意義。
當創建另一個類將要依賴的東西時(通常是這樣),編寫一個接口然后實現它是一個好習慣。例如,如果您知道自己的類將依賴於另一個類,則“ ”,那么您可以暫時停止在第一類上的工作,以編寫IDoesSomething
接口,並完成依賴於IDoesSomething
的第一類。 您尚未弄清楚實現的內容,但這無關緊要,因為您正在編寫的類僅取決於接口。 (反轉控制-好的做法。)然后,您可以編寫一個實現IDoesSomething
的類。
只是舉例說明一下。 假設我正在編寫一個提供Menu
對象的類,該對象包含MenuItem
對象的嵌套列表:
public class MenuProvider
{
public Menu GetMenu(string menuId)
{
//code that gets the menu
return menu;
}
}
然后我意識到,在返回菜單之前,需要過濾掉某些菜單項。 這可能基於配置設置,特定用戶或其他任何情況。
我可能會寫這個接口:
public interface IMenuFilter
{
void FilterMenu(Menu menu);
}
然后像這樣修改我的原始類:
public class MenuProvider
{
private readonly IMenuFilter _menuFilter;
public MenuProvider(IMenuFilter menuFilter)
{
_menuFilter = menuFilter;
}
public Menu GetMenu(string menuId)
{
//code that gets the menu
//filter the menu
_menuFilter.FilterMenu(menu);
return menu;
}
}
我不知道IMenuFilter
的實現將是什么。 實際上,它可能最終是一堆單獨的類的組合,每個類都執行一種類型的過濾。 但是重點是,我不需要停止在MenuProvider
上所做的事情就可以弄清楚這一點。 我可以編寫此類,甚至可以使用IMenuFilter
對其進行測試,然后繼續編寫該過濾器的詳細信息。
您是否希望在該接口的實現之間共享常用功能? 如果是這樣,則創建一個抽象基類。 否則,現在不必擔心。 您以后可以隨時添加一個。 但是對接口編程幾乎總是一個好主意。
一般情況下,你會用一個接口 或繼承。 我通常不會在同一個類中都不使用這兩者。
要從基類繼承功能時,請使用繼承。
當您希望不同的類實現某些相同的核心功能,但不一定要共享代碼時,請使用接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.