2009-07-05 24 views
2

保護されたコンストラクタを持つクラスとMustInheritとマークされたクラスの違いは何ですか? (私はVB.Netでプログラミングしていますが、これはおそらくC#にも等しく適用されます)。保護されたコンストラクタとMustInherit/Abstractクラス

なぜ私はコンストラクタを共有/静的メソッドに変換したいという抽象クラスがあるからです。 (いくつかの制約を加えるために)。

共有機能でインスタンスを作成できないため、これを行うことはできません。

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新() End Subの MyBaseClass として 保護機能のCreateInstance(PARMLIST)PARMLISTがOKであれば、戻り新MyBaseClass() エンド機能の混乱だ エンドクラス – 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 

しかし、あなたには、いくつかを追加したい場合建設に制約がある場合は、例外をスローすることをお勧めします:

関連する問題