4
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看起来像第五个兄弟,但事实并非如此。另外,我希望能够创建特定于海龟的类,例如class BostonLeonardo : ILeonardo.

我从很多地方读过,这似乎是一场无休止的争论——有人说“接口内的继承”完全可以,而那些说不是——要么我不明白他们的解释,要么他们只是说这是不好的做法,没有解释为什么。

4

1 回答 1

7

您只能实现方法一次FightEatPizza因为只有一个接口定义了它们。如果您在每个etc. 接口上都有Fight,您可以选择实现它们一次,或者使用显式接口实现来更改每个接口签名的这些方法的行为。我会举一个例子,因为我喜欢 TMNT:EatPizzaILeonardo

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 的类型签名是适当的接口时,这些显式接口实现才会生效。

于 2014-01-24T04:10:57.317 回答