错误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)
{
}
}
}
答案 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)
我认为您将Interface
与Class
混淆。
如果您希望基类派生使用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()
}
}