public class A
{
protected void fun1()
{
fun2();
}
protected virtual void fun2()
{
Console.WriteLine("A.fun2");
}
}
public class B : A
{
public void Test()
{
base.fun1();
}
protected void fun2()
{
Console.WriteLine("B.fun2");
}
}
public class Program
{
public static void Main(string[] args)
{
B model = new B();
model.Test();
}
}
客官可猜输出是什么?
答案: A.fun2
然而我们修改一下class.B的代码
protected new void fun2()
{
Console.WriteLine("B.fun2");
}
注意 这里我们使用了 new 修饰符,new修饰符的含义是隐藏父类的同签名成员
客官可猜到本次的输出是什么? A.fun2
protected override void fun2()
{
Console.WriteLine("B.fun2");
}
输出是什么? B.fun2
如果在java中,我们第一次的代码就直接输出 B.fun2 ,因为 java 中同名方法会重写 父类方法,但是
C# 中必须明确的用虚方法和 override关键词来重写父类方法
我们再次改一下class.B的代码
public class B : A
{
public void fun1()
{
base.fun1();
}
public void fun2()
{
Console.WriteLine("B.fun2");
}
}
public class Program
{
public static void Main(string[] args)
{
A model = new B();
model.fun1();
}
}
当我们使用 A model=new B(); 来实例化对象时候,输出依然是 A.fun2
public override fun2()
{
Console.WriteLine("B.fun2");
}
再次使用 override 关键词改造 B的 fun2后,输出 B.fun2
public class B : A
{
public void fun1()
{
fun1();
}
public void fun2()
{
Console.WriteLine("B.fun2");
}
}
为B类增加 fun1() 成员
按我们上文中的结论,B的fun1 里边调用的是 A的fun1 ,如果不是,这里就死循环了。所以 B里的fun1 作用和刚开始 B里的 Test() 作用相同。这里的输出:A.fun2
public class Person
{
public virtual void Say()
{
Console.WriteLine("say: hello");
}
}
public class People1 : Person
{
public override void Say()
{
Console.WriteLine("say: nihao");
}
}
public class People2 : Person
{
public new void Say()
{
Console.WriteLine("say: sawadika");
}
}
public class People3 : People2
{
public void Say()
{
Console.WriteLine("say: laosan");
}
}
Person p = new Person();
p.Say(); //say: hello
Person p1 = new People1();
p1.Say(); //say: nihao
Person p2 = new People2();
p2.Say(); //say: hello
Person p3 = new People3();
p3.Say(); //say: hello
所以我们得出一个结论:
C# 中必须明确的用虚方法和 override关键词来重写父类方法
当子类重写了父类的方法后,当子类代替父类出现时都将使用子类的 方法,而不使用自己父类的方法
本文链接:https://blog.nnwk.net/article/150
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论