关于虚方法的 override和new的理解,在父类对象引用子类实例时调用被override或new的方法时的理解。
可以这样理解吗?将子类继承还有虚方法的父类时,如果不写这个虚方法,就表示默认继承了父类的这个方法,用override重写这个方法就表示继承了这个虚方法,然后对其进行了修改...
可以这样理解吗?将子类继承还有虚方法的父类时,如果不写这个虚方法,就表示默认继承了父类的这个方法,用override重写这个方法就表示继承了这个虚方法,然后对其进行了修改。如果用new重写这个方法,表示子类的这个方法与父类的是2个不同的方法。用override重写的话,用父类的对象引用子类实例时,父类对象调用这个虚方法,运行的其实是子类override的方法,我不明白的就是override是直接修改了父类的虚方法吗?因为父类调用方法是只能调用父类自己有的方法呀,它看不到子类的方法。难道是override的方法是修改父类的虚方法在继承到子类的么?可是这样的话连续2个子类override虚方法,父类的虚方法会是最后一次override的内容,可我通过实验否定了,2个子类override父类虚方法后,用父类对象引用这2个子类的实例,调用虚方法都是每个子类里自己改写的方法。所以我很不理解override的机制到底是什么?
例如
public class A
{ public virtual void Show(){Console.WriteLine("A.Show()"); }
public class B : A
{ public override void Show(){Console.WriteLine("B.Show()");} }
public class C : A
{ public override void Show(){Console.WriteLine("C.Show()");} }
public class Program
{
static void Main(string[] args)
{
A b = new B();
A c = new C();
b.Show();
c.Show();
}
}
结果为:B.Show() C.Show() 展开
例如
public class A
{ public virtual void Show(){Console.WriteLine("A.Show()"); }
public class B : A
{ public override void Show(){Console.WriteLine("B.Show()");} }
public class C : A
{ public override void Show(){Console.WriteLine("C.Show()");} }
public class Program
{
static void Main(string[] args)
{
A b = new B();
A c = new C();
b.Show();
c.Show();
}
}
结果为:B.Show() C.Show() 展开
2个回答
展开全部
A b = new B(); //注意这里,你new的是子类B,所以b不能称之为父类A的实例
A c = new C(); // 同上
b.Show(); //这里的b实际上是子类B的实例,所以调用的show方法是在B类里重写后的方法
c.Show(); //同上
如果你想调用A类里的方法就不能那样写,要这样写:
A b = new A();
A c = new A();
b.Show();
c.Show();
这样输出的结果就是:A.Show() A.Show()
如果看不明白,可以再问我
A c = new C(); // 同上
b.Show(); //这里的b实际上是子类B的实例,所以调用的show方法是在B类里重写后的方法
c.Show(); //同上
如果你想调用A类里的方法就不能那样写,要这样写:
A b = new A();
A c = new A();
b.Show();
c.Show();
这样输出的结果就是:A.Show() A.Show()
如果看不明白,可以再问我
更多追问追答
追问
A b = new A();
A c = new A();
要是这么写我就明白了,不理解的是用父类对象,引用子类实例时,new 和override父类虚方法的机制。只是看到了表象,A b = new B(); 如果B类中是override修饰父类虚方法,调用b.Show()时,使用的是B类的Show(),如果B()类中是new修饰的,调用b.Show()时,使用的是A类中的Show(),不明白其中的机制是什么,有人说A b =new B(),b的地址是B()的引用,但是这怎么说明B中2中不同的修饰,掉用的结果不同
追答
父类对象引用子类实例,然后调用方法时,调用的是父类里的方法,如果子类重写了,就调用重写后的方法(PS:重写方法是在实例化对象的过程中实现的,即你引用哪个子类,就调用哪个子类里重写的方法,不引用则不重写),new是不影响父类方法的,即没有重写父类方法,所以如果子类是new的话,调用的就是父类原有的方法;如果想调用子类new的方法,就要直接用子类实例调用此方法,例如:B类里的show()是new,然后你想调用,你要B b=new B();这是b.show()显示的结果为:B.show()
这样能懂么
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询