vb.net - 如何创建不会导致无限循环的工厂对象

标签 vb.net

每当我尝试创建一个新的 CD 对象时,都会出现堆栈溢出。我想要一个参数被传递到 mediaFactory 以便它可以确定创建什么类型的媒体。任何人都可以指出为什么我在执行此操作时可能会遇到问题“将媒体调暗为 CD = 新 CD()”

谢谢

Public MustInherit Class MediaFactory
Inherits MediaContext
Implements IMedia

Public Sub New(ByVal typeId As Integer)
    MyBase.new()
    _mediaTypeId = typeId
End Sub

Private _mediaTypeId As Integer
Public Property mediaTypeId() As Integer Implements IMedia.mediaTypeId
    Get
        Return _mediaTypeId
    End Get
    Set(ByVal value As Integer)
        _mediaTypeId = value
    End Set
End Property

End Class


Public Class CD
Inherits MediaFactory 
Implements IMedia 

Public Sub New() 
    MyBase.New(1) 
End Sub 

Public Sub New(ByVal name As String) 
    MyBase.New(1) 
    MyBase.title = name 
End Sub 

End Class


Public Class MediaContext

Private Shared _strategies As New Dictionary(Of MediaEnum, IMedia)()

Public Sub New()
    _strategies.Add(MediaEnum.CD, New CD())

End Sub

Public Sub New(ByVal name As String)
    _title = name
End Sub

Private _title As String
Public Property title() As String
    Get
        Return _title
    End Get
    Set(ByVal value As String)
        _title = value
    End Set
End Property

End Class

最佳答案

在无限递归的情况下会发生堆栈溢出。当您有如下方法调用时会发生这种情况:

Public Sub B()
 A()
End Sub

Public Sub A()
 B()
End Sub

然后调用 A() 或 B()。调用堆栈的大小(跟踪当前正在运行的子程序,以及调用它的子程序,等等直到程序的主程序)无限增长,直到达到可用空间的限制。 (它看起来像 A > B > A > B > A > B... 等等)

在您的情况下,您的 New() 方法似乎调用了 New(1),后者又调用了 MediaFactory 的 New(integer),后者调用了 .new(),后者调用了您工厂的 New()...希望您能了解情况.

关于vb.net - 如何创建不会导致无限循环的工厂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2150797/

相关文章:

vb.net - 多维控件数组

vb.net 程序,生成代码并将其复制到剪贴板

java - 日志 - vb.net 到 java

vb.net - 如何在VB.net中将[']解码为'?

vb.net - 文本框验证

c# - 如何开始在 .NET 中创建应用程序 API

JavaScript 对象 _doPostBack 中的预期错误 ('' ,'' )

vb.net - 系统管理.管理异常: Not found

asp.net - 当 DataBind() 代码被触发时 System.StackOverflowException

c# - 在自定义控件的属性上添加 BindableAttribute 的目的是什么?