黑马程序员技术交流社区
标题:
关于new隐藏基类方法
[打印本页]
作者:
陈顺亮
时间:
2012-10-5 18:44
标题:
关于new隐藏基类方法
本帖最后由 陈顺亮 于 2012-10-5 22:08 编辑
namespace 多态
{
class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Say();
Student s = new Student();
s.Say();
Teacher t = new Teacher();
t.Say();
Console.ReadKey();
}
}
public class Person//创建Person
{
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public void Say()
{ Console.WriteLine("我是人"); }
}
public class Student : Person
{
public void Say()
{ Console.WriteLine("我是学生"); }
}
public class Teacher : Person
{
public void Say()
{ Console.WriteLine("我是老师"); }
}
}
复制代码
这样进行写代码会提示说是否隐藏基类方法用关键字new
可是在创建person实例,student实例,teacher实例后,对象调用的不就是自身类中的方法吗?加上new与 不加new最后显示结果一样,那为何还要加上new,单步调试的时候子类对象调用方法也没有经过父类啊 能否具体解释一下
作者:
神马王刚
时间:
2012-10-5 19:33
这里的new写与不写,本质一样。加关键字new后,是为了让编译时不会产生警告而已,执行原理都一样,只能隐藏基类的方法,而不能重写它。new只是把基类的方法隐藏了,实际上基类还是有实例的,比如你代码中的基类Person的方法,用new之后p.say();仍然是存在的。隐藏是为子类提供便利的,这也是多态的方便所在。我们可以通过改变引用的声明类型来使用不同的方法。但是隐藏父类方法一般都尽量避免,不推荐这么做,所以有机会还是用override重写吧。
作者:
刘俊红
时间:
2012-10-5 20:33
隐藏基类成员的方法有两种:
第一种在子类中定义相同前面的成员,并在声明前加new。(当然不用new直接定义相同的成员也可,但是可能会有警告)
第二种在父类中把方法定义为virtual,在子类中覆写方法override。
两种不同点:前者当把子类转化成父类时,调用方法仍然调用父类的方法。而后者当把子类转化为父类时,调用的仍然是子类的方法,换句话说,子类把父类的virtual给覆盖了。如果有几层调用,会调用最下面的最子类的子类方法。
作者:
陈顺亮
时间:
2012-10-5 22:07
了然了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2