2009-07-05 3 views
2

В чем разница между классом с защищенными конструкторами и классом, отмеченным как MustInherit? (Я программирую в VB.Net, но он, вероятно, в равной степени относится и к C#).Защищенные конструкторы и MustInherit/Abstract class

Причина, по которой я прошу, состоит в том, что у меня есть абстрактный класс, который я хочу преобразовать конструкторы в общие/статические методы. (Чтобы добавить некоторые ограничения).

Я не могу этого сделать, потому что невозможно создать экземпляр в общей функции.

Я собираюсь просто удалить ключевое слово MustInherit. Будет ли это иметь значение?

Спасибо.

ETA:

Я думаю, что я ответил на мой вопрос, если я удалить MustInherit ключевое слово, я больше не может включать в себя MustOverrides, которые очень полезны.

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

ETA2:

Чтобы уточнить, я не могу сделать ниже, если я не удалить MustInherit ключевое слово?

Public MustInherit MyBaseClass 

    Private Sub New() 
    End Sub 

    Protected Function CreateInstance(ParmList) As MyBaseClass 
    If ParmList is Ok Then Return New MyBaseClass() 
    End Function 

End Class 
+0

Вы должны указать, на каком языке вы говорите. – womp

+0

Спасибо за это, я обновил ее, указав, что это vb.net или C# – Jules

ответ

1

Вы можете вызвать Protected конструктор с помощью отражения и создать экземпляр класса, но вы не можете создать экземпляр класса abstract таким образом. Вы можете объявить методы MustOverride в классах MustInherit, но конструктор Protected не может ничего принуждать к производным классам.

Вы должны всегда объявлять классы, концептуально абстрактные как MustInherit. Конструкторы Protected могут быть полезны, когда вы предоставляете его вместе с некоторыми перегрузками Public, чтобы обеспечить дополнительную функциональность для производных классов.

+0

Да, как обычно, я понял, что после публикации мне нужен абстрактный класс, чтобы включить методы MustOverride. Итак, чтобы уточнить, я не могу сделать ниже, если не удалить ключевое слово MustInherit? Общественный MustInherit MyBaseClass Private Sub New() End Sub Protected Функция CreateInstance (ParmList) Как MyBaseClass Если ParmList является Ok Тогда Return New MyBaseClass() End Function End класса – Jules

+0

Это беспорядок, Я добавил выше к OP! – Jules

+0

Жюль: Да, ваше понимание правильное. –

0

Если класс имеет только защищенный конструктор, все же возможно иметь экземпляр класса, который может стоять сам по себе. Это потребовало бы работы с защищенным конструктором, например, с использованием отражения.

Если класс помечен как MustInherit, невозможно иметь экземпляр этого класса самостоятельно. Экземпляры могут создаваться только из производных/унаследованных классов.

0

Не уверен, что вы хотите.

Если вам необходимо создать объект абстрактного класса, я рекомендую вам создать реализацию частного класса вашего абстрактного класса и вернуть его в CreateInstanceMethod:

Public MustInherit MyBaseClass 
    Private BaseClassImplementation 
     Inherits MyBaseClass 

     ... 
    End Class 

    Public Function CreateInstance(paramList) as MyBaseClass 
     If paramList Is Ok Then Return New BaseClassImplementation 
    End Function 
End Class 

Однако, если вы хотите, чтобы добавить некоторые ограничения на строительство, я рекомендую исключать исключения:

Public MustInherit MyBaseClass 
    Protected Sub New(paramList) 
     If paramList IsNot Ok Then Thow New Exception 
     ... 
    End Sub 
End Class 
Смежные вопросы