(高手进)C#中的重写

来源:百度知道 编辑:UC知道 时间:2024/05/15 07:12:04
下面是我看的一论坛上的帖子:
重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override。 重写以后,用基类对象和子类对象访问myMethod()方法,结果都是访问在子类中重新定义的方法,基类的方法相当于被覆盖掉了。
例子:

using System;
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
public override void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main()
{
B b = new B();
b.F();
A a = new A();
a.F();
}
}
输出为
B.F
B.F
我按上面的程序调试了一下结果不对啊
只有把 A a = new A(); 改成
A a = b;才行
但后一句是什么

我来回答吧,先讲一个例子
解释override
刘师傅A,徒弟B, 师傅有个动作就是开抽屉,师傅习惯在第一个抽屉里放一把锯子,而他的徒弟学会了他的动作,但就是习惯在第一个抽屉放一把榔头。
e.g 【B b = new B();b.F();】
如果徒弟放了东西new B(),徒弟打开抽屉 F(),是什么?榔头。
e.g 【A a = new B()】
请问那要是徒弟放了东西,师傅到抽屉前打开时会是什么【A a=b】?师傅打开肯定是打开第一个抽屉,肯定还是榔头呗!!!
不明白加 qq18539167
第二个例子 解释 new
刘师傅A,徒弟B, 师傅有个动作就是开抽屉,师傅会在第一个抽屉里放一把锯子,他的徒弟也学会了他的习惯,但他觉的不爽 但【保留】师傅的第一个抽屉放锯子这个习惯下,并在第二个抽屉放一把榔头,重定义他开抽屉就是开自己第二个抽屉.
B b = new B();b.F();
如果徒弟放的话,打开抽屉 意思就是打开了第二个抽屉 取出了榔头。(想想第一个抽屉是什么)
A a = new B();a.F();
是说徒弟放好的东西,师傅走到抽屉前来打开,师傅只会打开第一个抽屉,取出了自然是锯子喽,呵呵!

希望你能听明白

一个类的实例声明,你这里说的是一个基类的声明,基类比如“人”
你声明一个人然后 人 a=new 美国人(); a.speak();//那么说的是英语。
a=new 中国人(); a.speak();//说的是汉语
这个你可以理解 a 仅仅是个基类的占位符,不然无法多态(多态也即一个占位符能有不同表现状态行为)
这个你如果是刚刚接触OO,不用太着急,相信多思考,会有很大进步。其实OO就是安装现实世界编程的。

不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。

然而你写的是正确的!…… 我编译后结果B.F A.F

我前些日子看这个也没弄懂,最后也就不弄了