WedX - журнал о программировании и компьютерных науках

Преобразование типов 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
    

Наверное, что-то глупое, но у меня заканчиваются варианты.

11.09.2015

Ответы:


1

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

Поэтому вам нужно преобразовать IAnimal в Cow:

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

OR

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

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

  • 2

    Если я хочу использовать только что преобразованный объект как сам объект,
    мне нужно создать объект типа 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
    
    11.09.2015
  • Каждый раз, когда вы используете объект myAnimal, вы должны привести его, потому что ЭТО объявлено как IAnimal. Вы должны сообщить компилятору, какой конкретный тип вы ожидаете. 11.09.2015
  • Вышеупомянутое не компилируется, я получаю, что приведение недействительно от Eagle до ICow. Итак, как я могу создать объект, который имеет тот же базовый класс и реализует тот же базовый интерфейс? Преобразовать myAnimal в тип объекта ICow? 11.09.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]