You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Objective-C风格对象创建代码转为VB.NET参数化New Sub实现

问题

我习惯用Objective-C风格的createObject方式创建对象,而非标准的New关键字,这种方式方便先创建基础对象再初始化变量,甚至能在初始化基类或多数基础变量前执行前置操作。现有实现代码如下:

Public Shared Function createOrders(amount As String, base As String, quote As String, exchange As ExchangesClass, time As String, price As String, id As String, sellinginsteadofbuying As String, identifyingText As String) As OrderAlreadyPlacedAtanExchange
        Debug.Assert(base <> "")
        Debug.Assert(quote <> "")
        Debug.Assert(price <> "")

        Dim a = New OrderAlreadyPlacedAtanExchange
        a.InitializeForBasicSimpleOrder(amount, price, base, quote, exchange, sellinginsteadofbuying, identifyingText)

        time = IIf(time = "", "1-1-2000", time).ToString
        a._timeOrderPlaced = Date.Parse(time)
        a._id = id
        If quote = "IFLT" Then
            Dim b = 1
        End If

        Return a
    End Function

其中OrderAlreadyPlacedAtanExchange类继承自BasicSimpleOrder类:

Class OrderAlreadyPlacedAtanExchange
    Inherits BasicSimpleOrder
    
End Class

现在因为要使用JSON.NET,想改用标准的构造函数(New Sub)方式,但有几个疑问:

  1. OrderAlreadyPlacedAtanExchange的构造函数该如何初始化父类?
  2. 若调用BasicSimpleOrder的构造函数,是否会得到父类类型的对象?
  3. 是否应该保留InitializeForBasicSimpleOrder并在New Sub中调用?
解答

1. 构造函数中初始化父类的方式

在VB.NET里,你可以通过MyBase.New()调用父类的构造函数。如果父类有带参数的构造函数,直接传入对应参数即可。示例如下:

Class OrderAlreadyPlacedAtanExchange
    Inherits BasicSimpleOrder

    Public Sub New(amount As String, price As String, base As String, quote As String, exchange As ExchangesClass, sellinginsteadofbuying As String, identifyingText As String, time As String, id As String)
        ' 调用父类带参数的构造(假设BasicSimpleOrder有匹配参数的构造)
        MyBase.New(amount, price, base, quote, exchange, sellinginsteadofbuying, identifyingText)

        ' 执行子类自身的初始化逻辑
        time = If(time = "", "1-1-2000", time).ToString
        Me._timeOrderPlaced = Date.Parse(time)
        Me._id = id
        If quote = "IFLT" Then
            Dim b = 1
        End If
    End Sub
End Class

如果父类没有对应参数的构造,你可以先调用MyBase.New()(无参构造),再在子类构造里执行InitializeForBasicSimpleOrder方法完成父类初始化。

2. 调用父类构造不会得到父类对象

调用MyBase.New()只是触发父类的初始化逻辑,最终创建的对象仍然是OrderAlreadyPlacedAtanExchange类型。父类构造仅负责初始化父类层面的成员,不会改变对象的实际类型,你可以通过GetType()方法验证这一点。

3. 是否保留InitializeForBasicSimpleOrder?

需根据实际场景判断:

  • 如果父类的初始化逻辑已经可以通过构造函数覆盖,建议直接调用父类构造,不再保留该方法,更符合.NET的标准构造模式,也更适配JSON.NET的反序列化逻辑。
  • 如果这个初始化方法还会被其他场景调用(比如对象创建后需要重新初始化),可以保留它,并在子类构造里调用,兼顾兼容性和标准构造方式。

内容的提问来源于stack exchange,提问作者user4951

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:50:30