36

C# の継承について、私が理解できない非常に基本的なことがあると思います。誰かが私を啓発してくれませんか?

4

5 に答える 5

34

サブクラス化するときに、クラスのインスタンスを作成するために必要な条件を制限したい場合があります。

例を挙げましょう。クラスがスーパークラス コンストラクターを継承した場合、すべてのクラスは からのパラメーターなしのコンストラクターを持ちますObject。明らかにそれは正しくありません。

于 2009-01-08T23:51:43.543 に答える
29

コンストラクターが継承されるとどうなるかを考えると、問題が見え始めるはずです。

.NET のほぼすべての型が Object (パラメーターなしのコンストラクターを持つ) から継承されるため、作成するほぼすべての型がパラメーターなしのコンストラクターを持つことを余儀なくされます。しかし、パラメーターなしのコンストラクターが意味をなさない型がたくさんあります。

バージョン管理にも問題があります。基本型の新しいバージョンが新しいコンストラクターと共に表示される場合、派生型で新しいコンストラクターが自動的に取得されます。これは悪いことであり、壊れやすい基本クラスの問題の特定のインスタンスです。

より哲学的な議論もあります。継承は型の責任に関するものです (これは私がしていることです)。コンストラクターは型のコラボレーションに関するものです (これが私が必要としているものです)。したがって、コンストラクターを継承すると、型の責任と型のコラボレーションが混在することになりますが、これら 2 つの概念は実際には分離したままにする必要があります。

于 2009-01-09T01:24:30.113 に答える
12

スーパークラスのコンストラクターは、明示的に呼び出すかどうかに関係なく呼び出されます。それらは親クラスから連鎖します。コンストラクターがスーパークラスのコンストラクターを明示的に呼び出さない場合、そのクラスのデフォルトのコンストラクターは、コンストラクターのコードの前に暗黙的に呼び出されます。

于 2009-01-08T23:41:45.140 に答える
2

私はあなたが意味すると思います:

class Foo
{
   public Foo(int someVar) {}
}

class Bar : Foo
{
    // Why does Bar not automatically have compiler generated version of 
    Bar(int someVar): Foo(someVar) {}
}

これは C++ (および Java) から継承されていると思います。
ただし、これがあり、Bar に他のメンバー変数がいくつかあると仮定します。これにより、コンパイラによって生成されたコンストラクターが誤って使用され、BAr のメンバーが初期化されない可能性が生じることはありません。

于 2009-01-08T23:52:56.350 に答える
0

デフォルトのコンストラクタは常に呼び出されます。

class Bar : Foo { }

Bar がインスタンス化されると、デフォルトで Foo() コンストラクターが呼び出されます。

class Foo {
    public Foo(int someVar) {}
}

class Bar : Foo {
    public Bar() : base(42) {}
}

パラメーターなしのコンストラクターがない場合は、使用するコンストラクターを定義してパラメーターを渡す必要があります。

于 2009-01-08T23:44:37.177 に答える