隠蔽とオーバーライド

隠蔽とオーバーライドは

スーパークラスとサブクラスで同名のメンバーを定義でき、サブクラスで挙動

 を変更できる(処理を再定義できる)

という点は同じ。

だたし、ポリモーフィズムにおいて、以下の差がある。

・隠蔽の場合、静的な型と動的な型が異なる場合、静的な型のメンバが参照される

・オーバーライドの場合、静的な型と動的な型が異なる場合、動的な型のメンバが

 参照される

=隠蔽の場合はポリモーフィズムが使用できない。

(*)

 ・静的な型:変数宣言時に指定された型

 ・動的な型:変数に代入されているデータの実際の型

ex)

 class Program
 {
  static void Main(string[] args)
  {
   Money a = new Jpy();
   a.Name();    /// Moneyですが表示される
   a.VName();    /// JPYですが表示される
  }
 }
 public class Money
 {
  public void Name(){Console.WriteLine("Moneyです。");}
  public virtual void VName() { Console.WriteLine("Moneyです。"); }
 }
 public class Jpy:Money
 {
  public new void Name() { Console.WriteLine("JPYです。"); }
  public override void VName() { Console.WriteLine("JPYです。"); }
 }