接口实现和虚方法重写
继承接口和继承基类的实例如下
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("Animal is eating!");
}
}
public class Lion{}
public class Bird:Animal
{
public override void Eat()
{
Console.WriteLine("Bird is eating!");
}
public virtual void Build()
{
Console.WriteLine("Bird is building nest!");
}
}
public class Person:Animal
{
public override void Eat()
{
Console.WriteLine("Person is eating!");
}
public virtual void Build()
{
Console.WriteLine("Person is building house!");
}
}
public class Chinese:Person
{
public override void Eat()
{
Console.WriteLine("Chinese is eating!");
}
public override void Build()
{
Console.WriteLine("Chinese is building the Great Wall!");
}
}
基类Animal有一个Eat虚方法,子类Person重写Eat,子类Lion不做任何操作,Person调用的是重写后的Eat,Lion则调用基类的Eat;在Person和Bird中又分别定义了Build虚方法,在每一个类中分别去定义Build显然是不合理的(但是有人觉得没毛病,哈哈哈哈),此时可以将Build抽出来放到接口中,Person和Bird实现该接口,修改代码如下
public class Bird:Animal,IAction
{
public override void Eat()
{
Console.WriteLine("Bird is eating!");
}
public void Build()
{
Console.WriteLine("Bird is building nest!");
}
}
public class Person:Animal,IAction
{
public override void Eat()
{
Console.WriteLine("Person is eating!");
}
public void Build()
{
Console.WriteLine("Person is building house!");
}
}
public class Chinese:Person
{
public override void Eat()
{
Console.WriteLine("Chinese is eating!");
}
}
public interface IAction
{
public void Build();
}
那么问题就来了,实现接口中的Build和重写基类中的Build的区别是什么呢?当然不是指代码量上的区别
对比Eat和Build,可以看到Person的基类Chinese仍然可以重写Eat方法,而不能显示实现接口IAction中的Build方法,此时子类Chinese中使用的Build是其基类Person中实现的Build,那么如何在子类Chinese中实现对Build方法的“重写”?此时就要使用new关键字了,之前一直没想到new隐藏方法的使用场景是什么。。。修改代码如下
public class Chinese:Person
{
public override void Eat()
{
Console.WriteLine("Chinese is eating!");
}
public new void Build()
{
Console.WriteLine("Chinese is building the Great Wall!");
}
}
此时子类Chinese中的new表示隐藏了其基类Person中的Build方法,也可以在Person类中将实现的接口方法声明为Virtual,这样Chinese类中也可以直接对Build方法进行重写,代码如下
public class Person:Animal,IAction
{
public override void Eat()
{
Console.WriteLine("Person is eating!");
}
public virtual void Build()
{
Console.WriteLine("Person is building house!");
}
}
public class Chinese:Person
{
public override void Eat()
{
Console.WriteLine("Chinese is eating!");
}
public override void Build()
{
Console.WriteLine("Chinese is building the Great Wall!");
}
}
public interface IAction
{
public void Build();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义