System.Object はサブクラスを戻り値の型としてどのように使用できますか?

StackOverflow https://stackoverflow.com/questions/1316442

  •  19-09-2019
  •  | 
  •  

質問

.NET では次のことが当てはまります。 全て 型は System.Object から継承します。

私が逆説的だと思うのは、System.Object のいくつかのメソッドです。

  • パブリックバーチャル ToString();
  • パブリックバーチャル ブール Equals(オブジェクト objA, オブジェクト objB);

System.String は System.Object から継承されます。

[Serializable]
public class String : Object { /*...*/ }

System.Boolean は System.Object から継承されます。

[Serializable]
public struct Boolean : Object { /*....*/ }

System.Object クラスがサブクラスをそのメソッドの戻り値の型として使用できるようにする裏で何が起こっているのでしょうか?循環参照があるようですが、このコードはどのようにしてコンパイルされたのでしょうか。文字列 <-> オブジェクト <-> ブール値。

「それがどのように実装されているか」というステートメントが表示されると確信していますが、これらの戻り値の型が「System.Object」自体であり、サブクラスが string、bool、および bool の実装を使用しているかどうかは理解できます。宣言する他の System.ValueTypes 新しい 基本クラス。

それが理にかなっているといいのですが。

前もって感謝します、

ドミニク

役に立ちましたか?

解決

それは大したことない、基底クラスは常にサブクラスを参照することができます。例えば、このコードは完全に合法です。

class A
{
    public B CreateB();
    {
        return new B();
    }
}

class B : A
{
}

すなわち

許可されていない円形のアセンブリ参照を必要とするので、AおよびBは、別のアセンブリで定義された場合に だろうが問題であることに注意してください

他のヒント

循環参照は、そうでない場合は、親/子関係は、これまでどちらかの両側に存在しません、複数のプロジェクト間でのみ問題となります。

実際には、すべてのタイプがObjectから継承されていること、のないの完全に真実です。エリックリッペルトのブログのエントリを参照してください。このの上。

私は、派生クラスを返す基本クラスの問題を参照してくださいいけない。

またI)は、(Object.ToStringをので、円形の依存関係を参照していけません。 Stringオブジェクトを返します。 Stringクラスは、オブジェクトから派生するが、だから何?両方が同じアセンブリ内にある場合、問題はありません。

他の人があなたにもジェネリック型パラメータとして導出クラスを使用して基本クラスからクラスを派生することができます言ったことに加えて。このパターンのきちんとした用途がたくさんあります。

public class A<T>
{
}

public class B : A<B>
{
}

は、.NETフレームワークにおける循環依存関係を確認したい場合は、System.dllSystem.Xml.dllSystem.Configuration.dllよりもう探す必要はありません。

Microsoftはこれらのアセンブリを作成した方法は私には謎です。実は、私は別の質問をするとしてこれを掲示することがあります。 ..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top