实现“继承”(实现)通用接口的接口?

时间:2014-01-24 04:09:25

标签: c# inheritance interface interface-implementation

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

我从许多地方读过,似乎是一场无休止的辩论 - 有人说“接口内的继承”很精细,而那些说不是 - 我要么不理解他们的解释,要么就是说它不好练习而不解释原因。

1 个答案:

答案 0 :(得分:6)

您只能实现方法FightEatPizza一次,因为只有一个接口定义了它们。如果您在每个Fight等接口上都​​有EatPizzaILeonardo,那么您可以选择实现它们,或者使用显式接口实现来更改这些方法的行为界面签名。我会做一个例子,因为我喜欢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让我兴奋