C#不支持类的多继承,然而却可以继承多个接口。简单的就不说了,来看看下面的例子:

 public interface IRead {
    string GetText();
 }
 public interface IWrite
 {
    string GetText();
 }    

对于上面的这种情况,如果一个类同时继承上面两个接口,那么如何去实现这两个名字相同的方法呢?

显示接口方法(EIMI)

复制代码
public class MyCpu:IRead,IWrite {
     string IRead.GetText() {
          return "这个方法实现IRead的方法";
     }
     string IWrite.GetText()
     {
          return "这个方法实现IWrite的方法";
     }
     public string GetText()
     {
          return "这个方法实现自己独有的方法";
     }
}
复制代码

如上图,只需要在方法前面加上接口名即可。然而显示接口方法只能是私有方法。

然而这种方法要慎用,因为使用了这种方法后,值类型的实例在转换成接口时会发生装箱。因为是私有的,所以也不能被派生类调用。

最重要的是显示接口方法的调用很奇葩:

var cpu = new MyCpu();
Console.WriteLine(cpu.GetText());
Console.WriteLine(((IRead)cpu).GetText());
IWrite b = cpu;
Console.WriteLine(b.GetText());
Console.ReadLine();

必须先转一道再调用,会让使用的人很困惑。

用基类还是用接口

  • 基类更多的是一个身份上的事,比如鸟是燕子的基类。而接口是一个行为上的事,比如鸟和飞机都能飞,那么飞就是一个接口。
  • 基类可以为派生类提供良好的默认实现。
  • 基类添加一个方法,派生类自动就可以继承。而接口添加一个方法,派生类还需要重写。

然而我认为实际上仅仅用第一个来判断就好了,因为它更偏向于基于实际业务去考虑到底用基类还是接口。

posted on   韩子卢  阅读(724)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构



点击右上角即可分享
微信分享提示
电磁波切换