2017-10-01 23 views
-3

私はこのエラー基本クラスにデフォルトの新しいクラスが必要な理由

https://docs.microsoft.com/en-us/dotnet/visual-basic/misc/bc30387

を持って、なぜだろうか。

基本クラスと派生クラスの両方でparameterless newを呼びたくない場合はどうなりますか?

私は継承を使用しないとできます。なぜ継承を使うのは私がもはやそうすることができないということですか?

問題を再現するには

説明は何ですか?だから、すべてのクラスはパラメータのない新しいクラスを必要とするわけではありませんが、継承を持つクラスは必要ですか?それは意味をなさない。

パラメータlessコンストラクタで派生クラスを呼び出さないとどうなりますか?私はクラスがパラメーターなしで構築されることを意図していません。

たとえば、パラメータのないコンストラクタを使用せずにクラスを作成したいとします。私はそうすることができます。

しかし、クラスを2つに分割したいとします。親子クラス。パラメータのないコンストラクタを使用しないことをお勧めします。

私はそれができないようですね。そのような場合は誰でも確認してください。

+0

コードを共有してください。 –

+6

あなたが投稿したリンクは完全に明確な説明を与えてくれます。 – Plutonix

+0

質問は、継承を使用する場合に限り、パラメータのないコンストラクタを使用しないクラスを作成できないということが非常に奇妙であることを知りました。 –

答えて

1

リンクでは、パラメータを持つ基本クラスに明示的なコンストラクタがあり、パラメータなしの場合、コンストラクタなしで派生クラスを残すことはできないと言われています。 VB.NETでは派生クラスの暗黙のコンストラクタを作成できないためです。

両方のコンストラクタを記述しない場合は、完全に有効です。

ただし、以下のような明示的なコンストラクタなしで派生クラスを宣言することはできません。 VB.NETでは基本クラスの初期化方法を決定できないためです。

public class Base 
    Public sub New(ByVal Item As Integer) 

    End Sub 
End Class 

Public Class Derived 
    Inherits Base 

End Class 

この問題を解決するには、デフォルトクラスのコンストラクタをデフォルト値で呼び出す派生クラスに対して、デフォルトコンストラクタを宣言できます。

public class Base 
    Public sub New(ByVal Item As Integer) 

    End Sub 
End Class 

Public Class Derived 
    Inherits Base 

    Public Sub New() 
     MyBase.New(5) 

    End Sub 
End Class 
+0

なぜ基本クラスのパラメータコンストラクタを使用してvb.netがパラメータコンストラクタを作成できますか?ああ、コンストラクタは単に継承されない特別な関数なので、 –

+0

すべてのクラスには、それ自体を初期化するコンストラクタが必要です。パラメータのないコンストラクタがない場合、コンパイラはどちらを呼び出すべきかを判断することができず、それ自体でパラメータを渡すことはできません。したがって、明示的に呼び出す必要があります。継承部分では、派生クラスは基本クラスの内部構造を気にする必要はなく、initを実行するために基本ctorだけを呼び出すだけでよい。 – fofik

関連する問題