【问题标题】:Non-virtual, non-abstract method causing "C# virtual or abstract members cannot be private"导致“C# 虚拟或抽象成员不能是私有的”的非虚拟、非抽象方法
【发布时间】:2014-12-24 15:12:21
【问题描述】:

错误 1 ​​'Interface.myDerivedClass.myMethod()':虚拟或抽象成员不能是私有的 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)
        {

        }
    }
}

【问题讨论】:

  • 实现一个界面的需求override关键字
  • 所有接口方法都是公共的。您在派生类中的签名应该只是 public void myMethod() {}。如果不指定public,则假定该方法在派生类中是私有的。
  • 正如 MaxHampton 所暗示的,您不需要 override 关键字,因为您没有覆盖任何内容。只有在基类中声明了 virtualabstract 时,您才能覆盖某些内容。接口成员被实现,而不是被覆盖。
  • 一个接口不是一个类。
  • jmcilhinney,你的解释最适合我 - 谢谢大家!

标签: c# inheritance private-members


【解决方案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()
   }
}

【讨论】:

    【解决方案2】:

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

    实际的解决方法是使方法public 实现接口方法:

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

    或者,如果您希望方法不直接从类中可见,您也可以explicitly implement 接口(类似于private,但您可以通过转换为接口来调用):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2011-11-16
      • 2011-07-18
      • 2010-10-11
      • 2016-05-08
      • 2023-03-23
      相关资源
      最近更新 更多