0

クラス---A

class ClassA
{
    public string c1()
    {
        return "Class-A";
    }

}

クラス---B

class ClassB:ClassA
{
    public string c2()
    {
        return "Class-B";
    }
}

メインクラス

- - -パート1 - - - - - - - - -

 ClassA obj1 = new ClassB();
 string a = obj1.c1();//Here i will get only c1
 Console.WriteLine(a);
 Console.ReadLine();

- - -パート2 - - - - - - - - -

 ClassB obj1 = new ClassA();
 string a = obj1.c2();//Her i will get both c1 and c2
 Console.WriteLine(a);
 Console.ReadLine();

Part-1では c1 しか取得しません。変数 (obj) が ClassA 用にスタックに作成されているかどうかを知り、ヒープから ClassB のアドレスを割り当てる必要があります。実際に何が起こっているのでしょうか?

Part-2で、Getting(コンパイルエラー)変換エラー。

ありがとう、ジョビー・クリアン

4

3 に答える 3

5

パート1

ClassA obj1 = new ClassB();

これにより、オブジェクトのインスタンスが作成されます。ClassB

また、という型のという変数も宣言します。その変数のは常に参照、または のインスタンスへの参照になります。この場合、初期値は新しく作成されたオブジェクトへの参照です。(から派生するため、オブジェクトへの参照も参照として使用できます。)obj1ClassAnullClassAClassBClassBClassAClassBClassA

を呼び出すとc1、単に実装が呼び出されますClassAが、そのメソッド内では、オブジェクトの「内部」で動作しているため、出力しthis.GetType()た場合でも の型が返されます。ClassBClassB

スタックとヒープについてはまだ心配しないことを強くお勧めします。次の 3 つの異なる概念に注目してください。

  • オブジェクト
  • 参照 (オブジェクトへの移動方法、または null)
  • 変数 (名前付きの保存場所)

Eric Lippert は、この種のことについて多くのブログを書いています。The Stack Is An Implementation Detailから始めることをお勧めします。

パート2

ClassB obj1 = new ClassA();

これは のインスタンスを作成ClassAし、新しいオブジェクトへの参照をタイプ の変数に代入しようとしますClassB。から派生しClassAていないため、機能しませんClassBClassAコンパイル時の型の参照を typeの変数に使用することはできませんClassB。これがうまくいかない理由の例として、これを行うのと少し似ています:

string x = new object();
Console.WriteLine(x.Length); // What could this possibly print out?

基本的に、継承はそのようには機能しません。(ほとんどの場合)のインスタンスを のインスタンスClassBとして扱うことはできますが、 のインスタンスを のインスタンスとして扱うことはできません。通常は に状態 (フィールド) を追加するため、 のインスタンスに情報が存在しなくなります。ClassAClassAClassBClassBClassA

于 2012-04-09T07:18:04.773 に答える
0

(パートIIで)何が起こるかというと、クラスAをクラスBの変数としてインスタンス化しようとしているということです。変数には、インスタンス化されたオブジェクトでアクセス可能な使用可能なプロパティが必要なため、これは実行できません。したがって、メソッドc2()を呼び出そうとすると、オブジェクトには存在しません。変数の使用可能なすべてのプロパティとメソッドがインスタンス化されたオブジェクトに存在するため、逆の方法でも問題なく機能します。

于 2012-04-09T07:21:55.540 に答える
0

クラスAのオブジェクトを作成し、クラスBのコンストラクターを呼び出すと、その特定のクラスmateのオブジェクトが作成され、プロパティにアクセスします。なぜあなたはあなたにとって興味をそそるものを楽しんでいるのですか?

于 2012-04-09T07:24:19.417 に答える