interface ITurtle
{
void Fight();
void EatPizza();
}
interface ILeonardo : ITurtle
{
void UseKatana();
}
interface IRaphael : ITurtle
{
void UseSai();
}
interface IDonatello : ITurtle
{
void UseBo();
}
interface IMichelangelo : ITurtle
{
void UseNunchuku();
}
如果我想制作一只可以完成所有4只的大乌龟怎么办?我想编码:
class GrandTurtle : IMichelangelo, IDonatello, IRaphael, ILeonardo
{
// Implementation not shown for brevity.
}
这是否可行,因为现在看来我必须每次实施Fight()
和EatPizza()
4次。但我认为这两个常用功能将解决,只需要实现一次,对吧?
我本可以创建4个中间接口而不继承ITurtle
,然后让GrandTurtle
实现ITurtle
。这解决了接口继承问题,但现在它看起来语义错误,因为它使ITurtle
看起来像第5个兄弟,但它不是。另外,我希望能够创建特定于海龟的类,例如class BostonLeonardo : ILeonardo
。
我从许多地方读过,似乎是一场无休止的辩论 - 有人说“接口内的继承”很精细,而那些说不是 - 我要么不理解他们的解释,要么就是说它不好练习而不解释原因。
答案 0 :(得分:6)
您只能实现方法Fight
和EatPizza
一次,因为只有一个接口定义了它们。如果您在每个Fight
等接口上都有EatPizza
和ILeonardo
,那么您可以选择实现它们,或者使用显式接口实现来更改这些方法的行为界面签名。我会做一个例子,因为我喜欢TMNT:
interface ILeonardo
{
void Fight();
void EatPizza();
void UseKatana();
}
interface IRaphael
{
void Fight();
void EatPizza();
void UseSai();
}
interface IDonatello
{
void Fight();
void EatPizza();
void UseBo();
}
interface IMichelangelo
{
void Fight();
void EatPizza();
void UseNunchuku();
}
class GrandTurtle : IMichelangelo, IDonatello, IRaphael, ILeonardo
{
// Code that fires when Fight is called on ILeonardo turtle = new GrandTurtle()
void ILeonardo.Fight()
{
UseKatana();
}
// Code that fires when Fight is called on IRaphael turtle = new GrandTurtle()
void IRaphael.Fight()
{
UseSai();
}
// Code that fires for all other turtles
public void Fight()
{
UseThatCrappyStickThingTheOldActionFiguresCameWith();
}
// Implement EatPizza() and such here...
}
只有当GrandTurtle的类型签名是适当的接口时,这些显式接口实现才会生效。
编辑:抱歉,我的回答最初是错误的;我一直在喝酒,TMNT让我兴奋