簡體   English   中英

為什么在類中實現的C#接口方法必須是公共的?

[英]Why must an C# interface method implemented in a class be public?

我有一個繼承接口的類。 接口成員方法是在我的類中實現的,沒有訪問修飾符(因此,默認情況下它是私有的)。

我收到錯誤“無法實現接口成員,因為它不公開”。

為什么不允許這樣做? 我不能覆蓋輔助功能嗎?

這是一個為什么能夠覆蓋可見性沒有意義的例子:

interface someI
{
    void doYourWork();
}
public class A : someI
{
    public void doYourWork()
    {
        //...
    }
}

public class B : someI
{
    private void doYourWork()
    {
        //...
    }
}
void Main()
{
    List<someI> workers = getWorkers();
    foreach(var worker in workers)
        worker.doYourWork();
}

當你的工人屬於B型時會發生什么? 你正在調用一個方法,好像它是公開的,但它是一個私有方法。 如果你想要這個功能,那么它不是真正的私有方法嗎?

如果您只希望通過界面引用它時公開,那么您可以將其定義為:

public class B : someI
{
    void someI.doYourWork()
    {
        //...
    }
}

你最終得到了這個:

var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible

方法必須public實現,因為它們必須通過接口可調用,因此可以從接口作為類型訪問。

您可以在此處選擇一些選項來“ 更改 ”該方法的可見性。 鑒於:

public interface IFoo 
{
    bool IsFoo();
}

A. 明確地實施方法

public class Foo : IFoo
{
    bool IFoo.IsFoo() { return true; }
}

該方法只能通過接口(在這種情況下為IFoo )。

B.更改界面的可見性

將接口定義為internal而非public 因此, Foo也必須是internal

要求接口實現是公共的只是一個邏輯要求。 當你實現一個接口時,你告訴編譯器“嘿,我實現了這個接口上的每個方法”。 因此,將該方法設為私有使其不再可訪問 - 並且邏輯上未實現。 接口用作代碼的契約,該代碼使用您的對象,表示您始終可以調用我對象上的接口中定義的任何方法。 如果實施方法是私有的,則不再適用。

如果你想隱藏你的實現,比如Intellisense,那么你可以簡單地實現這個方法,就像@Bryan提到的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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