2010-05-12 3 views
1

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

В принципе, у меня есть 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 

(не знаю, если эти дочерние классы должны отличаться, как только instantied от типа 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 Enhanced Metafile три раза на консоли. Что я здесь делаю неправильно?

ответ

2

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

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

помечается как Shared - они принадлежат к классу не является объектом.

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

Оно должно быть:

Protected _extentions As String() 
Protected _targettype As String 
Protected _name As String 
+0

безупречный! Спасибо! –

1

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

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

у вас было бы «Windows Bitmap», напечатанное три раза.

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

Protected _extentions As String() 
Protected _targettype As String 
Protected _name As String 
+0

отлично, спасибо Антоном. большое объяснение. Майкл попал первым, но +1 для вас. –

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