interface honda {

    void meth();
    protected void meth2();
}

class crv : honda { 
    void honda.meth() { }  //public not allowed
    void honda.meth2() { } //protected not allowed
}

我给出了接口honda,它有两个抽象方法:
Meth();即public
方法2();即protected

当我在实现类crv中指定public void honda.meth(){}protected honda.meth2() { }时,会出现什么错误?

我的意思是我有一个假设:这是因为这样做,我们为方法提供默认实现,所以它类似于接口中,但它不是.当我说public void honda.meth(){}时,这一假设将证明错误是正确的,但当我try 说protected honda.meth2() { }时,这并不能证明错误是正确的,因为接口中的meth2()protected.
你能帮帮我吗?

推荐答案

通过将实现类中的方法声明为honda.meth,这是一个explicit interface implementation.基本上,这意味着这些方法只能在类型为honda的对象上调用,而不能在类型为crv的对象上调用,因此永远不会使用类型为crv的访问修饰符.

如果您希望能够在hondacrv类型上调用这些方法,只需在实现类中从方法名中删除honda.前缀,如下所示:

interface honda {

    void meth();
    void meth2();
}

class crv : honda { 
    public void meth() { } 
    public void meth2() { }
}

请注意,除非您使用的是default implementations in interfacesC#特性,否则不能在接口(publicprotected等)中指定访问修饰符.

如果必须保护meth2,则将honda更改为抽象类,将meth2更改为抽象方法:

public abstract class honda {
    
   public abstract void meth();
   protected abstract void meth2();

}

Csharp相关问答推荐

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

如何注册接口类型,类型<>

S能够用DATETIME来计算,这有什么错呢?

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

Rider将.NET安装在哪里

WinForms在Linux上的JetBrains Rider中的应用

异步实体框架核心查询引发InvalidOperation异常

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

反序列化私有成员

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

同一组件的多个实例触发相同的事件处理程序

如何允许数组接受多个类型?

Blazor Server.NET 8中的Blazore.FluentValidation问题

使用C#和.NET 7.0无法访问Cookie中的数据

为什么Swashbakle/Swagger在参数中包含变量名?

如何在绑定到数据库的datagridview中向上或向下移动行

如何将 colored颜色 转换为KnownColor名称?

如何在C# WinForm控件中使用Windows 10/11的黑暗主题?

如何提高C#中比较大 struct 的性能?

现在是否有一个.NET SDK等效于AsyncEx的AsyncLock?