0

オーバーライド機能を使用する場合にのみ、継承を使用する必要があることを読みました。コード共有に継承のみを使用する場合は、インターフェイスと構成を使用する必要があります。以下のコードを見てください。

Public Class Animal
    Public Overridable Sub Eat()
        MsgBox("Animal Eat no arguement")
    End Sub
End Class

Public Class Horse
    Inherits Animal
    Public Overrides Sub Eat()
        MsgBox("Horse Eat no arguement")
    End Sub
End Class

Horse は Animal を継承し、Eat をオーバーライドします。これは、私が読んだことに基づく継承の有効な使用法です。ここで、animnal から継承する Cat クラスと Dog クラスを追加するとします。さて、その馬と言ってください。Cat と Dog は Animal クラスの Eat 関数を (オーバーライドするのではなく) 使用します。これは、私が読んだ内容に基づく継承の無効な使用法です (インターフェイスを使用する必要があります)。確かに、インターフェース、つまり IEatable を使用して Eat インターフェースを実装する場合、Eat をすべてのクラスに記述する必要があり、再利用性と保守性が最小限に抑えられます。ここで何が欠けていますか?

更新応答を読んだ後、次のようなことができると思います:

 Public Class Animal
    Public Overridable Sub Eat()
        MsgBox("Animal Eat no arguement")
    End Sub
End Class

Public Class Fish
    Inherits Animal
    Implements ISwim
    Private s1 As New Swim
    Public Sub Swim() Implements ISwim.Swim
        s1.Swim()
    End Sub
End Class

Public Class Shark
    Inherits Animal
    Implements ISwim
    Private s1 As New Swim
    Public Sub Swim() Implements ISwim.Swim
        s1.Swim()
    End Sub
End Class

Public Class Elephant

End Class

Public Class Swim
    Public Sub Swim()
        MsgBox("Animal can swim")
    End Sub
End Class

Public Interface ISwim
    Sub Swim()
End Interface

上記のコードでは、3 匹の動物のうち 2 匹が ISwim を実装し、コンポジションを使用して Swim の実装を提供しています。これは有効なアプローチですか?

4

2 に答える 2

2

Eatクラスのすべてまたは一部に同じコードを使用できる場合は、実装に継承を使用します。一部のクラスに異なる実装が必要な場合は、それを仮想化し、Animal明確に異なる実装を持たないクラスの実装を使用できます。

すべてのクラスに異なる実装がある場合、または一部のクラスのみに機能を追加する場合は、インターフェイスを使用します。ISwimたとえば、インターフェイスは一部の動物によってのみ実装されます。

于 2013-01-28T19:45:08.453 に答える
1

IS-A関係をモデル化するには、継承を使用する必要があります。Horseは の型である ためAnimal、ここで継承することは完全に理にかなっています。また、コードの再利用については議論しません。

ほとんどの場合、多くの種類の動物が共通の行動を共有しているため、コードの共有が実際に行われていることがわかります。しかし、共有実装は、階層が問題のドメインを正しくモデル化した結果であり、継承する理由ではありません。

デフォルトの実装を共有する動物の種類が多い場合は、基本クラスでその実装を提供しますAnimal。ほとんどの動物に適用できる明確な実装がない場合 (または、動物の作成者に動作を実装する方法を明示的に宣言させたい場合) は、抽象関数を使用します。類似した動作を共有する無関係なタイプのオブジェクトが存在する場合 (例: 飛行機とスズメの両方が飛ぶことができる)、およびすべてのタイプの動物が特定の動作を示すわけではない場合、共通の動作をインターフェイス (例: ) で説明することは理にかなっていますIFlightCapable

于 2013-01-28T19:44:47.590 に答える