2014-10-29 132 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() 
    } 
}