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.
}

これは可能ですか?今では、それぞれ 4 回実装する必要があるようFight()ですEatPizza()。しかし、これら 2 つの共通機能は解決され、一度実装するだけで済むと思いますよね?

を継承せずに 4 つの中間インターフェイスを作成してITurtleから、GrandTurtle実装することもできましたITurtleITurtleこれにより、インターフェイスの継承の問題は解決されますが、5 番目の兄弟のように見えるため、意味的に間違っているように見えます。さらに、タートル固有のクラスを作成できるようにしたいと考えていますclass BostonLeonardo : ILeonardo

私は多くの場所から読みましたが、それは終わりのない議論のようです.「インターフェース内の継承」は完全に問題ないと言う人もいれば、そうではないという人もいます.どうして。

4

1 に答える 1

7

メソッドを定義するインターフェイスは 1 つだけなので、メソッドFightを実装できるのは 1 回だけです。などの各インターフェイスがあるEatPizza場合は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 に答える