也许我只是不知道要搜索什么,但我在这里试图弄清楚如何创建一个继承类的集合。基类,我永远不会使用。
基本上,我有3个组件:
所以它做到了,#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增强型图元文件三次。我在这里做错了什么?
答案 0 :(得分:2)
三个属性:
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 :(得分: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