Loading [MathJax]/extensions/tex2jax.js

2012年11月13日火曜日

c# 修飾子 new overrideの違い

やりたいこと
継承したときのメソッドにつける修飾子にnewとoverrideがあるけど、その違いについてまとめてみる。 現状わかっていることだけ.
準備
猫クラスと猫王クラスを準備する。まずは修飾子をつけない。
  1. class Cat  
  2. {  
  3.     public void Cry()  
  4.     {  
  5.         Console.WriteLine("にゃお~");  
  6.     }  
  7. }  
  8.   
  9. class CatKing : Cat  
  10. {  
  11.     public void Cry()  
  12.     {  
  13.         Console.WriteLine("にゃお~猫王だぞ~");  
  14.     }  
  15. }  
そうすると警告はでるが、コンパイルは通る。警告はnewを使用してください。というような内容。
newの場合
基底クラスの型に代入すると、基底クラスのメソッドが呼び出される。
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         Cat tama = new CatKing();  
  6.         tama.Cry();  
  7.   
  8.         Console.ReadLine();  
  9.     }  
  10. }  
  11.   
  12. class CatKing : Cat  
  13. {  
  14.     public new void Cry()  
  15.     {  
  16.         Console.WriteLine("にゃお~猫王だぞ~");  
  17.     }  
  18. }  
  19.   
  20. class Cat  
  21. {  
  22.     public void Cry()  
  23.     {  
  24.         Console.WriteLine("にゃお~");  
  25.     }  
  26. }  
結果は「にやお~」になる。
overrideの場合
基底クラスの型に代入しても、派生クラスのメソッドが呼び出される。
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         Cat tama = new CatKing();  
  6.         tama.Cry();  
  7.   
  8.         Console.ReadLine();  
  9.     }  
  10. }  
  11.   
  12. class CatKing : Cat  
  13. {  
  14.     public override void Cry()  
  15.     {  
  16.         Console.WriteLine("にゃお~猫王だぞ~");  
  17.     }  
  18. }  
  19.   
  20. class Cat  
  21. {  
  22.     public virtual void Cry()  
  23.     {  
  24.         Console.WriteLine("にゃお~");  
  25.     }  
  26. }  
結果は「にゃお~猫王だぞ~」になる。
0 件のコメント:
コメントを投稿