C#で継承の基礎を学びたいと思っており、スコープとアクセシビリティの理解にギャップがあることを認識しました。説明する例:オーバーライド時のスコープの違いと基底クラスメソッドの隠蔽との比較
using System.Windows.Forms;
namespace InheritanceTests {
class Program {
public static void Main() {
(new A()).Foo(); // A: 1
(new B()).Foo(); // B: 2
((A)(new B())).Foo(); // B: 2 (+)
(new C()).Foo(); // C: 3
((A)(new C())).Foo(); // A: 1 (++)
}
}
class A {
private int x = 1;
public virtual void Foo() { MessageBox.Show("A: " + this.x); }
}
class B : A {
private int x = 2;
public override void Foo() { MessageBox.Show("B: " + this.x); }
}
class C : A {
private int x = 3;
public new void Foo() { MessageBox.Show("C: " + this.x); }
}
}
私はおそらく関連している(+)に関する質問と(++)を、持っている:
(+)に関しては、なぜB
インスタンスのプライベートフィールドがした後もx
アクセス可能ですA
へのキャスト?
(++)に関して、A
のFoo
メソッドを実行すると、this.x
は3と評価されないのですか?