1

.NETでは、すべての型がSystem.Objectから継承することは事実です。

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

  • パブリック仮想文字列ToString();
  • public virtual bool Equals(object objA、object 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、および新しい基本クラスを宣言する他のSystem.ValueTypes 。

それが理にかなっていることを願っています。

前もって感謝します、

ドミニク

4

6 に答える 6

7

大したことではありません。基本クラスは常にサブクラスを参照できます。たとえば、このコードは完全に合法です:

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

class B : A
{
}

AとBが別々のアセンブリで定義されている場合は、循環アセンブリ参照が必要になるため、問題になることに注意してください。これは許可されていません。

于 2009-08-22T17:01:51.007 に答える
2

循環参照は複数のプロジェクトにわたる問題にすぎません。そうでない場合、親子関係が両側に存在することはありません。

于 2009-08-22T17:05:06.540 に答える
2

実際、すべての型がObjectから継承するということは完全には真実ではありません。これについては、 EricLippertのブログエントリを参照してください。

于 2009-08-22T18:09:56.283 に答える
0

.NET Frameworkで循環依存関係を確認したい場合は、、、System.dllおよびSystem.Xml.dllSystem.Configuration.dllを参照してください。

マイクロソフトがこれらのアセンブリをどのように作成したかは、私には謎です。実際、これを別の質問として投稿するかもしれません...

于 2009-08-22T17:18:30.083 に答える
0

基本クラスが派生クラスを返すという問題は見当たりません。

さらに、Object.ToString();以降、循環依存関係は表示されません。Stringオブジェクトを返します。Stringクラスはオブジェクトから派生しますが、それではどうでしょうか。両方が同じアセンブリにある場合、問題はありません。

于 2009-08-22T17:03:36.760 に答える
0

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

public class A<T>
{
}

public class B : A<B>
{
}
于 2009-08-22T19:57:03.960 に答える