今天为了过几天的笔试,复习了一下面向对象的多态,比较了一下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个语言实现多态的方式,因为现在学了太多的语言有时候就会思想混乱,错把一个语言实现多态的方法当成另一个,写了这文后希望自己以后能记住。