一道面试题的思考
2023-02-18 16:47:14 时间
在继承中new和override相同点和区别?看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式改变了父类方法Print()的行为。测试代码输出什么?为什么?
public void DoTest()
{
B1 b1 = new B1(); B2 b2 = new B2();
b1.Print(); b2.Print(); //按预期应该输出 B1、B2
A ab1 = new B1(); A ab2 = new B2();
ab1.Print(); ab2.Print(); //这里应该输出什么呢?
}
public class A
{
public virtual void Print() { Console.WriteLine("A"); }
}
public class B1 : A
{
public override void Print() { Console.WriteLine("B1"); }
}
public class B2 : A
{
public new void Print() { Console.WriteLine("B2"); }
}
不得不承认,这道题很考验.net程序员的基础知识。看似简单的继承,重载和覆写,却大有玄机。
它不仅涉及到对象的创建,也涉及到对象在内存的分配,更要求面试者对对象在内存中的结构分布有深刻的认识。
相关文章
- 函数式编程(一) 认识“编程范式”和“函数”
- C#中使用Socket实现简单Web服务器
- C#中使用Socket请求Web服务器过程
- comet在asp.net中的实现
- 依赖倒置(DIP)与依赖注入(DI)
- 软件设计原则与模式
- .NET开发笔记(二十三) 谷歌地图下载
- .Net开发笔记(二十一) 反射在.net中的应用
- .Net开发笔记(二十)创建一个需要授权的第三方组件
- .Net开发笔记(十九) 创建一个可以可视化设计的对象
- .net开发笔记(十八) winform中的等待框
- .Net开发笔记(十七) 应用程序扩展
- .net开发笔记(十六) 对前部分文章的一些补充和总结
- .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)
- .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)
- .net开发笔记(十三) Winform常用开发模式第一篇
- .net开发笔记(十二) 设计时与运行时的区别(续)
- .Net开发笔记(十一) 设计时(Design-Time)和运行时(Run-Time)的区别
- .Net开发笔记(十) “容器-组件-服务”模型
- .Net开发笔记(九)自定义窗体设计器