今天爲了過幾天的筆試,複習了一下面向對象的多態,比較了一下C++,C#和JAVA實現多態的方法,發現JAVA實現多態比前兩者簡單很多,只要在子類中override父類的方法就可以了,不需要加什麼關鍵字,JAVA這樣就可以直接實現多態了
再看看C#,需要在父類方法前加virtual,子類繼承的方法前加override纔可以實現多態,兩者少一個都不可以,就說就算你父類加了virtual,子類如果沒有override或者是個new是不能實現多態的,如果父類沒有virtual子類沒有override關鍵字那就更不可以了,看下面代碼:
using System;
abstract class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public abstract void G();
internal virtual void a()
{
Console.WriteLine("A.F");
}
}
class B:A
{
public override void F()
{
Console.WriteLine("B.F");
}
public override void G()
{
Console.WriteLine("B.G");
}
internal new void a()
{
Console.WriteLine("B.F");
}
}
class Class1
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
a.G();
b.F();
b.G();
a.a();
b.a();
}
}
abstract class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public abstract void G();
internal virtual void a()
{
Console.WriteLine("A.F");
}
}
class B:A
{
public override void F()
{
Console.WriteLine("B.F");
}
public override void G()
{
Console.WriteLine("B.G");
}
internal new void a()
{
Console.WriteLine("B.F");
}
}
class Class1
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
a.G();
b.F();
b.G();
a.a();
b.a();
}
}
結果:
B.F
B.G
B.F
B.G
A.F
B.F
再來談一談才C++的多態,C++的多態實現只要在父類方法前加virtual申明爲虛函數就可以了,子類需要重載不需要加光鍵字,加了反而錯。
寫以上文章僅僅爲了幫助自己記憶3個語言實現多態的方式,因爲現在學了太多的語言有時候就會思想混亂,錯把一個語言實現多態的方法當成另一個,寫了這文後希望自己以後能記住。