簡體   English   中英

接口和基本抽象類c#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM