2015-09-11 2 views
2

Я пытаюсь вернуть себе голову в VB.Net (было некоторое время), и не может обойти эту простую проблему.VB.Net Преобразование типа

Вот мой абстрактный базовый класс с интерфейсом:

Imports VBRefresh.Animal 

Public Interface IAnimal 
    ReadOnly Property AnimalType() As TypeOfAnimal 
    Property IsAlive As Boolean 
End Interface 

Public MustInherit Class Animal 
    Implements IAnimal 

    Public Enum TypeOfAnimal 
     Insect 
     Mammal 
     Fish 
     Bird 
     Reptile 
    End Enum 

    Private _animalType As TypeOfAnimal 
    Public ReadOnly Property AnimalType As TypeOfAnimal Implements IAnimal.AnimalType 
     Get 
      Return _animalType 
     End Get 
    End Property 

    Private _isAlive As Boolean 
    Public Property IsAlive() As Boolean Implements IAnimal.IsAlive 
     Get 
      Return _isAlive 
     End Get 
     Set(ByVal value As Boolean) 
      _isAlive = value 
     End Set 
    End Property 

    Public Sub New(animalType As TypeOfAnimal) 
     _animalType = animalType 
    End Sub 

End Class 

А вот два производных класса (из которых Cow расширяющее IAnimal):

Public Interface ICow 
    Inherits IAnimal 

    Property FriendlyName As String 
End Interface 

Public Class Cow 
    Inherits Animal 
    Implements ICow 

    Public Sub New() 
     MyBase.New(TypeOfAnimal.Mammal) 
    End Sub 

    Private _friendlyName As String 
    Public Property FriendlyName As String Implements ICow.FriendlyName 
     Get 
      Return _friendlyName 
     End Get 
     Set(value As String) 
      _friendlyName = value 
     End Set 
    End Property 

End Class 

Public Class Eagle 
    Inherits Animal 

    Public Sub New() 
     MyBase.New(TypeOfAnimal.Bird) 
    End Sub 

End Class 

Я пытаюсь изменить тип от myAnimal до Cow, поэтому я могу получить доступ к его собственности FriendlyName, но я не могу заставить его работать без

  1. Создание отдельного объекта и установка этого.
  2. Декларирование FriendlyName в интерфейсе IAnimal .. Я попытался литья myAnimal к ICow, но это не дает мне доступ к FriendlyName собственности?

    Private Sub Main_Load(sender As Object, e As EventArgs) Handles Me.Load 
    
        Dim myAnimal As IAnimal = New Eagle 
        myAnimal.IsAlive = True 
    
        myAnimal = New Cow 
        myAnimal.FriendlyName = "Bella" 'this line doesn't work 
    
        Dim myCow As ICow = New Cow 
        myCow.FriendlyName = "Bella" 
    
        MessageBox.Show(myAnimal.AnimalType.ToString) 
    End Sub 
    

Вероятно, что-то глупо, но я бегу из вариантов здесь.

ответ

2

Вы объявили myAnimal as IAnimal. IAnimal не имеет свойства FriendlyName.

Поэтому вы должны бросить IAnimal к Cow:

DirectCast(myAnimal, Cow).FriendlyName = "Bella"

ИЛИ

DirectCast(myAnimal, ICow).FriendlyName = "Bella"

+0

Спасибо, я знал это уже, но мне нужен объект ICow от myAnimal. – grmbl

0

Если я хотел бы использовать вновь ввергнуть объект как сам объект,
I необходимо создать объект типа ICow, которому я назначаю литой объект:

Public Class Main 
    Private Sub Main_Load(sender As Object, e As EventArgs) Handles Me.Load 

     Dim myAnimal As IAnimal = New Eagle 
     myAnimal.IsAlive = True 

     myAnimal = New Cow 
     myAnimal.FriendlyName = "Bella" 'this line doesn't work 

     myAnimal = DirectCast(myAnimal, ICow) 
     myAnimal.FirendlyName = "Bella" 'this is still unavailble? 

     'guess I have to solve it this way then: 
     Dim myCow As ICow = DirectCast(myAnimal, ICow) 
     myCow.FriendlyName = "Bella" 

     MessageBox.Show(myAnimal.AnimalType.ToString) 
    End Sub 
End Class 
+0

Каждый раз, когда вы используете объект 'myAnimal', вы должны его использовать, потому что он объявлен как IAnimal. Вы должны сообщить компилятору, какой особый тип вы ожидаете. – user2190035

+0

Вышеприведенное не компилируется, я получаю, что акты недействительны от Eagle до ICow. Итак, как я могу создать объект, который имеет тот же базовый класс и реализует один и тот же базовый интерфейс? Преобразовать myAnimal в тип объекта ICow? – grmbl

Смежные вопросы