Могу ли я передать делегат в конструктор абстрактного класса из конструктора потомка? - PullRequest
2 голосов
/ 15 февраля 2010

У меня есть абстрактный класс, для работы которого требуется делегат. Я передаю делегата в конструктор. Теперь, когда у меня есть конструктор не по умолчанию, мне нужно вызвать конструкторы абстрактного класса из конкретного класса, что означает, что мне нужно использовать MyBase.New (...). Я включил быстрый пример ниже.

Public MustInherit Class BaseClass
    Public Delegate Sub WorkMethod()
    Private _Work As WorkMethod

    Public Sub New(ByVal Work As WorkMethod)
        Me._Work = WorkMethod
    End Sub
End Class

Public Class ConcreteClass
    Public Sub New()
        MyBase.New(AddressOf DoSomethingHere)
    End Sub

    Public Sub DoSomethingHere()
        'Do some work here
    End Sub
End Class

Я пытался сделать это, но постоянно получаю следующую ошибку: «Неявная ссылка на объект в процессе строительства недопустима при вызове другого конструктора».

Могу ли я не делать то, что пытаюсь сделать выше? Первоначально у меня была установка делегата в его собственном методе установки. Но затем я создаю обманчивый API, потому что он требует указания метода для правильной работы.

Ответы [ 3 ]

3 голосов
/ 15 февраля 2010

Вы не можете передать что-то, принадлежащее ConcreteClass, потому что объект все еще находится в стадии разработки при вызове конструктора базового класса. Таким образом, он не может быть использован в то время.

Добавление абстрактного метода в базу звучит более разумно.

3 голосов
/ 15 февраля 2010

Вместо того, чтобы принимать делегата, есть ли причина не указывать абстрактный метод в базовом классе, а реализовывать его в конкретном классе? Это был бы нормальный способ достижения такого рода вещей.

Если вам нужен делегат по другим причинам, вы всегда можете создать его из абстрактного метода в базовом классе.

(В других случаях бывает немного больно, что вы не можете получить доступ к Me / this в аргументах конструктора; я чувствую вашу боль здесь, но я думаю, что использование абстрактного метода, вероятно, лучше подходит для ситуации, которую вы описали.)

1 голос
/ 15 февраля 2010

Во время конструктора базового класса завершаются только части объекта базового класса - это на самом деле просто объект BaseClass до завершения конструктора ConcreteClass. Следовательно, вы не сможете вызвать DoSomethingHere в базовом ctor. Вы этого не делаете, но компилятор этого не знает и должен предположить, что вы это сделаете.

Если вы превращаете его в статическую функцию (с параметром в качестве параметра передается ConcreteClass), он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...