Не могу создать коллекцию унаследованных классов - PullRequest
1 голос
/ 12 мая 2010

Может быть, я просто не знаю, что искать, но я собираюсь немного помешаться, пытаясь выяснить, как создать коллекцию унаследованных классов. Базовый класс я никогда не буду использовать.

В основном, у меня есть 3 компонента:

  1. Вызов базового класса ImageFormat
  2. Дочерние классы ImageForm
  3. Код в Sub Main () для создания цикла сбор и цикл через него.

Так оно и есть, # 3. Проблема в том, что он всегда получает последний элемент, добавленный в коллекцию, и использует только его значения.

Вот мой базовый класс:

Public MustInherit Class ImageFormat
    Protected Shared _extentions As String()
    Protected Shared _targettype As String
    Protected Shared _name As String

    Public ReadOnly Property Extentions As String()
        Get
            Return _extentions
        End Get
    End Property
    Public ReadOnly Property TargetType As String
        Get
            Return _targettype
        End Get
    End Property
    Public ReadOnly Property Name As String
        Get
            Return _name
        End Get
    End Property
End Class

А вот и дочерние классы:

Class WindowsEnhancedMetafile
    Inherits ImageFormat
    Sub New()
        _extentions = {"EMF"}
        _targettype = "jpg"
        _name = "Windows Enhanced Metafile"
    End Sub
End Class
Class WindowsBitmap
    Inherits ImageFormat
    Sub New()
        _extentions = {"BMP", "DIB", "RLE", "BMZ"}
        _targettype = "jpg"
        _name = "Windows Bitmap"
    End Sub
End Class
Class WindowsMetafile
    Inherits ImageFormat
    Sub New()
        _extentions = {"WMF"}
        _targettype = "jpg"
        _name = "Windows Metafile"
    End Sub
End Class

(не знаю, должны ли эти дочерние классы отличаться, например, только от экземпляра типа ImageFormat или шаблонов Singleton - был бы признателен за любые ваши мысли по этому поводу)

Тогда моя рутина:

Sub Main()
    Dim imgFormats As New List(Of ImageFormat)
    imgFormats.Add(New WindowsBitmap)
    imgFormats.Add(New WindowsMetafile)
    imgFormats.Add(New WindowsEnhancedMetafile)
    Dim name As String = String.Empty
    For Each imgFormat In imgFormats
        name = imgFormat.Name
        Console.WriteLine(name)
    Next
    Console.ReadLine()
End Sub

Возвращает Расширенный метафайл Windows три раза на консоли. Что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Три свойства:

Protected Shared _extentions As String()
Protected Shared _targettype As String
Protected Shared _name As String

помечены как общие - они принадлежат классу, а не объекту.

Каждый раз, когда вы присваиваете новое значение _name, оно переопределяет старое значение, поэтому каждый раз вы печатаете одно и то же имя.

Должно быть:

Protected _extentions As String()
Protected _targettype As String
Protected _name As String
1 голос
/ 12 мая 2010

Ну, ваши _name и др. Shared, что означает, что они являются переменными уровня класса. Когда вы добавляете WindowsEnhancedMetafile, происходит перезапись этих полей информацией, специфичной для WMF. Если вы изменили свой код на:

imgFormats.Add(New WindowsMetafile)
imgFormats.Add(New WindowsEnhancedMetafile)
imgFormats.Add(New WindowsBitmap)

вы бы напечатали «Растровое изображение Windows» три раза.

Все, что вам нужно сделать, это изменить объявления полей на

Protected _extentions As  String()
Protected _targettype As String
Protected _name As String
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...