問題

インターフェイスを使用する理由や時期については、私はあまり明確ではありません。誰かがコンソールアプリケーションでVB.NETを使用してインターフェイスの完全でシンプルで小さな例を投稿できますか?どのように拡張可能ですか?

  ベストアンサー

要するに:継承に関する好意的な構成

インタフェースは、1つ以上のクラスをサポートするメンバ定義の共通セットです。重要なのは、インタフェースを実装するときに明示的に機能を提供しなければならないということです。

2つのサブクラスが基本から完全に機能するメンバーを継承できるため、継承を使用して同様の結果を得ることができます。しかし、継承の欠点は、サブクラスが基本クラスにハード依存してしまうことです。

次のクラスを考えてみましょう。

 Public Class Car
   Publc Sub OpenDoor(ByVal key As MyKey)
      Console.WriteLine("Access granted to car.")
   End Sub
End Class

Public Class House
   Public Sub OpenDoor(ByVal key as MyKey)
      Console.WriteLine("Access granted to house.")
   End Sub
End Class
 

これらの2つのクラスは、どちらもOpenDoor()メソッドを持っているため、多少関連していると言うことができます。共通の機能を抽出するための基本クラスを作成することさえ誘惑されるかもしれません。

 Public Class OpenableProperty
   Public Sub OpenDoor(ByVal key As MyKey)
      Console.WriteLine("Access granted to property.")
   End Sub
End Class

Public Class Car
   Inherits OpenableProperty
End Class

Public Class House
   Inherits OpenableProperty
End Class
 

次に、この抽象化を次のように使用できます。

 Public Class SecurityService
   Public Sub InspectProperty(ByVal item As OpenableProperty)
      Dim key As New MyKey()
      Console.WriteLine("Inspecting property...")
      item.OpenDoor(key)
   End Sub
End Class
 

しかし、あなたが鍵でそれらにアクセスできるという事実に基づいて、車に家を関連付けることはかなり弱い抽象化です。ヘック、豆の缶でさえ開くことができます!

しかし、関係が発生する可能性のある他の点もあります。たとえば、車と家の両方にエアコンがある場合があります。

 Public Class Car
   Inherits OpenableProperty
   Public Sub TurnOnAirConditioning()
      Console.WriteLine("Cool breezes flowing in car!")
   End Sub
End Class

Public Class House
   Inherits OpenableProperty
   Public Sub TurnOnAirConditioning()
      Console.WriteLine("Cool breezes flowing in house!")
   End Sub
End Class
 

TurnOnAirConditioning()も基本クラスに抽出する必要がありますか? OpenablePropertyであることとは何ですか? JewellySafeクラスはACなしでOpenablePropertyから継承できますか?この状況でのより良い答えは、インターフェイスを抽出し、継承するのではなくクラス内の機能を構成するためにこれら

 Public Interface IOpenable
   Sub OpenDoor(ByVal key As MyKey)
End Interface

Public Interface ICoolable
   Sub TurnOnAirConditioning()
End Interface

Public Class Car
   Implements IOpenable, ICoolable
   Public Sub OpenDoor(ByVal key as MyKey) Implements IOpenable.OpenDoor()
      Console.WriteLine("Access granted to car.")
   End Sub
   Public Sub TurnOnAirConditioning() Implements ICoolable.TurnOnAirConditioning()
      Console.WriteLine("Cool breezes flowing in car!")
   End Sub
End Class

Public Class House
   Implements IOpenable, ICoolable
   Public Sub OpenDoor(ByVal key as MyKey) Implements IOpenable.OpenDoor()
      Console.WriteLine("Access granted to house.")
   End Sub
   Public Sub TurnOnAirConditioning() Implements ICoolable.TurnOnAirConditioning()
      Console.WriteLine("Cool breezes flowing in house!")
   End Sub
End Class

Public Class JewelrySafe
   Implements IOpenable
   Public Sub OpenDoor(ByVal key as MyKey) Implements IOpenable.OpenDoor()
      Console.WriteLine("Access granted to jewelry safe.")
   End Sub
End Class
 

その後、あなたのアブストラクションは次のように消費されます:

 Public Class SecurityService
   Public Sub InspectProperty(ByVal item As IOpenable)
      Dim key As New MyKey()
      Console.WriteLine("Inspecting property...")
      item.OpenDoor(key)
   End Sub
End Class

Public Class ThermostatService
   Public Sub TestAirConditioning(ByVal item as ICoolable)
      Console.WriteLine("Testing Air Conditioning...")
      item.TurnOnAirConditioning()
   End Sub
End Class
 

SecurityServiceはCar、House、JewelrySafeの検査に使用できますが、ThermostatServiceはCarとHouseのACのテストにのみ使用できます。

 Sub Main()
   Dim securityService As New SecurityService()
   Dim thermostatService As New ThermostatService()

   Dim house As New House()
   Dim car As New Car()
   Dim jewelrySafe As New JewelrySafe()

   With securityService
      .InspectProperty(house)
      .InspectProperty(car)
      .InspectProperty(jewelrySafe)
   End With

   With thermostatService
      .TestAirConditioning(house)
      .TestAirConditioning(car)
   End With
End Sub
 

次の結果が得られます。

 Inspecting property...
Access granted to house.
Inspecting property...
Access granted to car.
Inspecting property...
Access granted to jewelry safe.
Testing Air Conditioning...
Cool breezes flowing in house!
Testing Air Conditioning...
Cool breezes flowing in car!
 

  同じタグがついた質問を見る

asp.netvb.netclassinterface