VB.Net - Реализация на унаследованных классах - PullRequest
0 голосов
/ 18 октября 2018

Например, у меня есть базовый класс с именем Animal.

Public MustInherit Class Animal
    Public Property Name As String

      Public Sub New(animalName As String)
        Name = animalName
      End Sub

    Public Sub Sleep()
        MsgBox("ZZZZZZZZZZZ")
    End Sub

    Public MustOverride Sub MakeSound()

End Class

Подклассы могут реализовывать один или несколько из следующих интерфейсов:

Public Interface IShed
    Sub Shed()
End Interface

Public Interface IBeAJerk
    Sub BeAJerk()
End Interface

У меня есть 3 подкласса:

Public Class Dog
    Inherits Animal
    Implements IShed

    Public Sub New(dogName As String)
        MyBase.New(dogName)
    End Sub

    Public Overrides Sub MakeSound()
        MsgBox("Bark")
    End Sub

    Public Sub WagTail()
        MsgBox("Wag")
    End Sub

    Public Sub DogShed() Implements IShed.Shed
        MsgBox("Dog fur everywhere")
    End Sub

End Class

Public Class Cat
    Inherits Animal
    Implements IShed
    Implements IBeAJerk

    Public Sub New(catName As String)
        MyBase.New(catName)
    End Sub

    Public Overrides Sub MakeSound()
        MsgBox("Meow")
    End Sub

    Public Sub Purr()
        MsgBox("Purr")
    End Sub

    Public Sub CatShed() Implements IShed.Shed
        MsgBox("Cat fur everywhere")
    End Sub

    Public Sub Ignore() Implements IBeAJerk.BeAJerk
        MsgBox("Ignore owner")
    End Sub
End Class

Public Class Snake
    Inherits Animal
    Implements IBeAJerk

    Public Sub New(snakeName As String)
        MyBase.New(snakeName)
    End Sub

    Public Overrides Sub MakeSound()
        MsgBox("SSSSSS")
    End Sub

    Public Sub Slither()
        MsgBox("Slither")
    End Sub

    Public Sub Bite() Implements IBeAJerk.BeAJerk
        MsgBox("Bite owner")
    End Sub
End Class

Теперь у меня есть метод, в котором я хочу принять животное (собаку или кошку), которое, как я знаю, реализует IShed. Есть ли способ добраться до интерфейса без определения типа животного? Было бы неплохо сделать что-то вроде:

Private Sub MakeAMess(sheddingAnimal As Animal.ThatImplementsIShed)
    'I want to be able to access both IShed (Shed method) and
    'Animal (Name property)
    sheddingAnimal.Shed()
    MsgBox(sheddingAnimal.Name & " made a mess!")
End Sub

Я не хочу делатьИнтерфейс IShed в другой абстрактный класс, потому что и Cat, и Snake должны реализовать интерфейс IBeAJerk.Но Змея не проливает.(Ну, на самом деле, я полагаю, змеи сбросили свою шкуру, но вы меня поняли.)

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 18 октября 2018

Я бы порекомендовал создать новый интерфейс IAnimal, а затем IShed расширить этот интерфейс (то же самое относится и к IBeAJerk).Тип Animal будет реализован IAnimal.Затем метод будет принимать параметр типа IShed.

Public Interface IAnimal
  Property Name As String
  Sub New(animalName As String)
  Sub Sleep()
  Sub MakeSound()
End Interface

Public Interface IShed
    Inherits IAnimal
    Sub Shed()
End Interface

Public Interface IBeAJerk
    Inherits IAnimal
    Sub BeAJerk()
End Interface

В качестве альтернативы вы можете разрешить Animal в качестве параметра метода и проверять во время выполнения, реализует ли переданный в экземпляре IShed а затем позвоните Shed

Private Sub MakeAMess(animal As Animal) 
  (TryCast(animal, IShed))?.Shed() 
  ' additional code doing stuff with Animal
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...