2014-10-29 75 views
0

錯誤1'Interface.myDerivedClass.myMethod()':虛擬或抽象成員不能是私有的c:\ users \ igmfun \ documents \ visual studio 2012 \ Projects \ Interface \ Interface \ Program.cs 16非虛擬的非抽象方法導致「c#虛擬或抽象成員不能私有」

使虛擬或抽象成員專用將使其它類(包括派生類)無法訪問,從而無法覆蓋該方法,使其虛擬或抽象質量毫無意義。我知道了。

但是等等......編譯器抱怨派生類中的成員,而不是基類......並且我從來沒有將該成員聲明爲虛擬或抽象...所以重寫的成員(派生類)從它正在覆蓋的虛擬或抽象成員繼承虛擬或抽象的質量?如果我將「override void myMethod(){}」更改爲「public override void myMethod(){}」,則會出現一個新錯誤,「找不到合適的方法覆蓋」。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Interface 
{ 
    interface myInterface 
    { 
     void myMethod(); 
    } 

    class myDerivedClass : myInterface 
    { 
     override void myMethod() 
     { 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 

     } 
    } 
} 
+0

關鍵字實現了接口書房的需要'override'關鍵字 – chengbo 2014-10-29 01:41:39

+1

所有的接口方法都是公開的。您在派生類中的簽名應該只是public void myMethod(){}。如果您不指定public,則假定方法在派生類中是私有的。 – 2014-10-29 01:44:48

+1

正如MaxHampton暗示的那樣,你不需要'override'關鍵字,因爲你不會覆蓋任何東西。如果在基類中聲明瞭「虛擬」或「抽象」,則只能重寫某些內容。接口成員已實現,未被覆蓋。 – jmcilhinney 2014-10-29 01:47:50

回答

2

該錯誤有點令人誤解 - 它看起來像編譯器首先嚐試本地推理代碼。所以它發現你正在做overrideprivate(默認)說明符。這顯然是一個錯誤,但它實際上隱藏了真正的一個 - 沒有什麼可以重寫開始(你可以看到,如果你改變代碼爲public override void myMethod(){})。

實際的解決辦法是讓法public因爲它工具接口方法:

class MyInterfaceImplementationClass : IMyInterface 
{ 
    public void MyMethod() 
    { 
    } 
} 

或者,如果你喜歡的方法是直接從類不可見(類似於private可以explicitly implement界面太,但你可以通過強制轉換接口調用):

class MyExplicitInterfaceImplementationClass : IMyInterface 
{ 
    void IMyInterface.MyMethod() 
    { 
    } 
} 

interface IMyInterface 
{ 
    void MyMethod(); 
} 
1

我覺得你與Class混淆Interface

如果你想有一個基類,從使用導出class關鍵字不interface

public class BaseClass 
{ 
    public void MyMethod() 
    { 

    } 
} 

public class DerivedClass : BaseClass 
{ 

} 

如果你想能夠override在基類中的方法,你可以將其標記爲virtual和使用override在派生類中

public class BaseClass 
{ 
    public virtual void MyMethod() 
    { 

    } 
} 

public class DerivedClass : BaseClass 
{ 
    public override void MyMethod() 
    { 
     // do soothing different 
     base.MyMethod() 
    } 
}