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