C#中new和override是继承中经常用到的两个关键字,但是往往有时候容易把这两个关键字的作用搞混淆。
new
C# new关键字表示隐藏,是指加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public new void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class A!,这是因为class B继承于class A,现在B中的Method函数隐藏A中的Method,所以从B(包括继承于B的子类)的角度来看类中的Method就是B.Method,A的Method不可见,但是如果从A的角度来看B,A只认识类B中继承于类A的Method函数,对于B类中的Method它不可见,所以A a=new B();a.Method();相当于是调用了类B中继承于A的Method函数
override
C#中override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数,使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)。
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public override void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class B!,因为class B的Method函数完全覆盖基类的同名虚函数Method,使整个继承链中看见的Method函数都是B中的Method,所以就算是以A角度来看B,A看到的Method函数也是B中的Method,因为A中的Method完全被B的覆盖了
但是如果要在B的对象中调用A的Method函数还是有办法,就是使用base关键字,比如
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public override void Method()
{
base.Method();
}
}
A a=new B();a.Method();会输出This Method in Class A!,base.Method();表示调用类B中继承于基类A的Method
new、override与interface
接口在相互继承的时候也会隐藏基接口的同名属性或函数,但是对于接口来说很特殊,隐藏对于基接口来说是不起作用的,接口内部的属性和函数都只是声明,它们都指向实现接口的类中的同名实现函数,通过接口调用接口的属性和函数的时候都会去调用实现类中从上到下最先可见的同名函数和同名属性:
{
void Method();
}
public interface IB : IA
{
new void Method();
}
public class IClass:IB
{
public void Method()
{
Console.WriteLine("This Method in Class IClass!");
}
}
public class ISubClass : IClass
{
public new void Method()
{
Console.WriteLine("This Method in Class ISubClass!");
}
}
IA ia = new ISubClass();ia.Method();输出This Method in Class IClass!因为对于ia来说在继承链中最先见到的同名实现函数是类IClass的Method函数
把上面的例子稍作修改:
{
void Method();
}
public interface IB : IA
{
new void Method();
}
public class IClass:IB
{
public virtual void Method()
{
Console.WriteLine("This Method in Class IClass!");
}
}
public class ISubClass : IClass
{
public override void Method()
{
Console.WriteLine("This Method in Class ISubClass!");
}
}
IA ia = new ISubClass();ia.Method();输出This Method in Class ISubClass!因为继承链中的Method函数都被ISubClass的Method覆盖了,所以对于ia来说在继承链中最先见到的同名实现函数是类ISubClass的Method函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构