我是一名自学成才的业余爱好者,我的所有知识都来自于看到编译器做什么和不喜欢什么。
假设我有(用C#表示法,Java可能有其他能力)
我需要覆盖的类看起来像这样:
public interface ICanDoSomethingElse
{
void DoIt();
}
class Parent : ICanDoSomethingElse
{
public void EatTacos()
{
}
void ICanDoSomethingElse.DoIt(string thingToDo)
{
// Implementation
}
}
所以我这样做:
class Child : Parent, ICanDoSomethingElse
{
new public void EatTacos()
{
}
void ICanDoSomethingElse.DoIt(string thingToDo) // NEW keyword illegal here?
{
// Implementation
}
}
问题
我发现 new 关键字在界面中是非法的。那是因为这是一个明确的界面吗?
有没有办法强制孩子实现一个接口,或者这只是意味着我需要设置一个隐式/显式转换?
答案 0 :(得分:3)
我发现新关键字在界面中是非法的。那是因为这是一个明确的界面吗?
错误是因为您在类中明确地实现了接口。
显式实现仅在您直接使用接口而不是底层实现时强制公开方法。
如果你的课程是这样的:
class Parent : ICanDoSomethingElse
{
...
public void DoIt(string thingToDo)
{
// Implementation
}
}
class Child : Parent, ICanDoSomethingElse
{
...
public new void DoIt(string thingToDo)
{
// Implementation
}
}
您需要使用new
关键字以某种方式隐藏Parent.DoIt
实施。
有没有办法强迫孩子实现一个接口,或者这只是意味着我需要设置一个隐式/显式的演员?
您可以Parent
类abstract
,然后是接口的方法abstract
:
abstract class Parent : ICanDoSomethingElse
{
...
public abstract void DoIt(string thingToDo);
}
class Child : Parent, ICanDoSomethingElse
{
...
public override void DoIt(string thingToDo)
{
// Implementation
}
}
此处,Child
必须实施DoIt
方法。
答案 1 :(得分:0)
我认为您执行的interface
实施与new
关键字无关。
new
关键字在从其父级继承的方法上定义新行为时正在使用
public class Parent{
public void SayHello(){
Console.WriteLine("Hello from parent");
}
}
和孩子一起
public class Child : Parent {
public new void SayHello(){
Console.WriteLine("Hello from child");
}
}
如果您想将界面用作实现,则无需使用new
关键字