C#における虚関数の役割
1590 ワード
まず例を見てみましょう.
C#とJAVAでは、派生クラスでベースクラスのメソッドaを書き換え、ベースクラスの参照(派生クラスのオブジェクト、すなわち多態性を指す)でメソッドaを呼び出し、結果が異なることがわかる.
JAVAではすべての方法が虚の方法であると考えられる.C#ではベースクラスのメソッドにvirtualキーワードを付けて派生クラスに書き換えるだけで、マルチステート時に有効です.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication5
{
class MyClass
{
public virtual int fun(int i)
{
int k=1;
return k * i;
}
public int test(int i) {
Console.WriteLine("test "+i*1);
return 0;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication5
{
class VirtualFunctionClass:MyClass
{
public override int fun(int i)
{
int k = 3;
return k * i;
}
public new int test(int i)
{
Console.WriteLine("test " + i*2);
return 0;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication5
{
class TestClass3
{
static void Main()
{
MyClass myc1 = new MyClass();
MyClass myc2 = new VirtualFunctionClass();
Console.WriteLine(myc1.fun(1));
Console.WriteLine(myc2.fun(1));
myc1.test(1);
myc2.test(1);
Console.ReadLine();
}
}
}
/* :
* 1
* 3
* test 1
* test 1
*/
C#とJAVAでは、派生クラスでベースクラスのメソッドaを書き換え、ベースクラスの参照(派生クラスのオブジェクト、すなわち多態性を指す)でメソッドaを呼び出し、結果が異なることがわかる.
JAVAではすべての方法が虚の方法であると考えられる.C#ではベースクラスのメソッドにvirtualキーワードを付けて派生クラスに書き換えるだけで、マルチステート時に有効です.