重写、重载
重写:顾名思义,重新写,重载:则不是。 这两个概念很容易混在一块,或者分不清楚。
比如:
public int add(int a, int b){...............}
public int add(int a,int b, int c){..............}
这个就重载,不是重写、
重写是继承派生一章中的概念,重新写继承来的方法!!用的比较多。
举例:
class A
{
public string s;
public void show()
{
Console.WriteLine("A");
}
}
class B : A
{
public B()
{
Console.WriteLine("B的构造函数");
}
public B(string s)
{
this.s = s;
Console.WriteLine("B的构造函数" + this.s);
}
public void show()
{
Console.WriteLine("B");
}
} //end B
一旦编译,立马提示:B.show()”隐藏了继承的成员“A.show()”。如果是有意隐藏,请使用关键字 new!
因此,可以改成:public new void show() ,当然也可以不加!!! 我猜测,之所以C#这样规定,是因为,
C++中有大量的重写,但是给人的感觉不是有意重写, 方便理解吧。
如果在调用时候,这样做:
B b=new B(); A a=(B)b; a.show(); 结果绝对是A,不是B。不要搞错了。。。。。
重写:顾名思义,重新写,重载:则不是。 这两个概念很容易混在一块,或者分不清楚。
比如:
public int add(int a, int b){...............}
public int add(int a,int b, int c){..............}
这个就重载,不是重写、
重写是继承派生一章中的概念,重新写继承来的方法!!用的比较多。
举例:
class A
{
public string s;
public void show()
{
Console.WriteLine("A");
}
}
class B : A
{
public B()
{
Console.WriteLine("B的构造函数");
}
public B(string s)
{
this.s = s;
Console.WriteLine("B的构造函数" + this.s);
}
public void show()
{
Console.WriteLine("B");
}
} //end B
一旦编译,立马提示:B.show()”隐藏了继承的成员“A.show()”。如果是有意隐藏,请使用关键字 new!
因此,可以改成:public new void show() ,当然也可以不加!!! 我猜测,之所以C#这样规定,是因为,
C++中有大量的重写,但是给人的感觉不是有意重写, 方便理解吧。
如果在调用时候,这样做:
B b=new B(); A a=(B)b; a.show(); 结果绝对是A,不是B。不要搞错了。。。。。
曾经得出的错误结论: new是用来修饰重写的,而且new可以加,也可以不加!!! 这是不对的,new 在C#中是用来new 实例化对象的,另外是用来隐藏基类的某个方法!!! 也就是说,替代了父类中的那个方法。另外一个关键字,override,它是针对虚函数的。
这样理解,跟没有说一样,而且又说又混乱。
干脆用代码说话,new ,用了之后,父类基类的可以调用父类的方法,而override 则是调用子类的方法。(override是针对虚函数)
借用百度知道的一个回复:
virtual是虚方法,就是等着被重写的,override就是重写后的virtual方法。至于new方法,是父类有这个一样的方法了(同名同参同返回值),但是子类用自己的方法,不用父类的那一套,就new一个,意思是我用我自己的