我有一个项目在严格模式关闭的情况下运行,下面是代码。
Public Overloads Function Save() As Child
Return MyBase.Save()
End Function
打开严格模式后,会显示一个错误:
Option Strict On不允许从"Parent"到"孩子"。
我的问题是正在执行的父对象的保存,还是子对象作为父对象的对象被转换为子对象的类型?
所有细节的长版本:
我正在努力理解这段代码到底做了什么,以便在VB中清晰地再现它,这样它就可以清晰地移植到C#中。
该项目使用CSLA,有一个基对象,它是从子对象的父对象继承的。子对象继承继承基本对象的父对象。
在child&家长。由于返回对象和函数类型的奇怪差异,这两个函数都被调用了吗?
如果您试图拥有Parent
子类Csla.BusinessBase
,然后拥有Child
子类Parent
,则需要实现Parent
,如下所示:
Public Class Parent(Of T)
Inherits BusinessBase(Of Parent(Of T))
End Class
Public Class Child
Inherits Parent(Of Child)
Protected Overrides Function SaveAsync(forceUpdate As Boolean, userState As Object, isSync As Boolean) As Task(Of Parent(Of Child))
Return MyBase.SaveAsync(forceUpdate, userState, isSync)
End Function
End Class
这允许通用类型T
从上通过继承层次结构流动,使得SaveAsync
(或旧版本的CSLA中的Save
(的实现是Child
类型。
MyBase
关键字会调用父函数。似乎Save()
函数的父版本的返回类型为Parent
。所以就好像你有这个代码:
Public Overloads Function Save() As Child
Dim result As Parent = MyBase.Save()
Return result
End Function
当函数被声明为返回不同类型时,不允许返回一种类型的对象。。。除非,正如错误消息告诉的那样,在这两种类型之间定义了隐式转换继承不能保证转换
不匹配的返回可能会导致事情在运行时爆炸这种事情正是为什么你应该总是有Option Strict On的原因。它将帮助您更好地处理正确的继承类型。
据推测,当Child
继承Parent
时,它会添加自己的字段、属性或方法。至少,这是继承的常见原因。因此,现在您尝试将一个没有任何额外内容的对象返回给一个不知道它丢失的调用者。这会带来灾难。
您可以通过在上面的代码中添加Cast()
来解决这个问题,但由于这里描述的问题,最好重写它以使用组合而不是继承。