非虚拟,非抽象方法导致“C#虚拟或抽象成员不能私有”

时间:2014-10-29 01:38:22

标签: c# inheritance private-members

  

错误1' Interface.myDerivedClass.myMethod()&#39 ;:虚拟或抽象成员不能是私有的c:\ users \ igmfun \ documents \ visual studio 2012 \ Projects \ Interface \ Interface \ Program.cs 16

将虚拟或抽象成员设为私有将使其它类(包括派生类)无法访问,从而无法覆盖该方法,使其虚拟或抽象质量无意义。我明白了。

但是等等......编译器抱怨派生类中的成员,而不是基类...而且我从未将该成员声明为虚拟或抽象...所以覆盖成员(在派生类)从它覆盖的虚拟或抽象成员继承虚拟或抽象质量?

另外,如果我改变

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)
        {

        }
    }
}

2 个答案:

答案 0 :(得分:2)

错误有点误导 - 看起来编译器首先尝试在本地推理代码。所以它发现你正在使用override(默认)说明符进行private。这显然是一个错误,但它实际上隐藏了真实错误 - 没有什么可以覆盖的(如果你将代码更改为public override void myMethod(){},你可以看到)。

实际修复方法是使方法public成为实现接口方法:

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

如果您希望方法直接从类中看不到,也可以explicitly implement界面(类似于private,但您可以通过强制转换到界面调用):

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

interface IMyInterface
{
    void MyMethod();
}

答案 1 :(得分:1)

我认为您将InterfaceClass混淆。

如果您希望基类派生使用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()
   }
}