Другой возвращаемый и объявленный результат типа функции, с выключенным строгим режимом - PullRequest
0 голосов
/ 30 октября 2018

У меня есть проект, который работает с выключенным строгим режимом, и этот код.

Public Overloads Function Save() As Child
     Return MyBase.Save()
End Function

При включении строгого режима появляется сообщение об ошибке:

Option Strict On запрещает неявное преобразование из 'Parent' в 'Ребенок'.

Мой вопрос - выполняется ли сохранение родительского объекта ИЛИ дочернего объекта, поскольку объект родителя приводится к типу дочернего элемента?

Длинная версия со всеми деталями:

Я пытаюсь понять, что именно делает этот код, чтобы четко воспроизвести его в VB, чтобы его можно было четко перенести на C #.

В проекте используется CSLA, есть базовый объект, который наследуется от Parent of the child. Ребенок наследует родителей, который наследует базу.

Вставка есть как у ребенка, так и у родителя. Вызваны ли оба из них странной разницей возвращаемого объекта и типа функции?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Если вы пытаетесь иметь 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 (или Save в более старых версиях CSLA) имеет тип Child.

0 голосов
/ 30 октября 2018

Вызывается функция сохранения дочернего элемента, но ключевое слово 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() к приведенному выше коду, но из-за проблем, описанных здесь, может быть лучше переписать это, чтобы использовать композицию вместо наследования.

...