![](/img/trans.png)
[英]C#: Why calling implemented interface method is faster for class variable than for interface variable?
[英]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.