C#中的interface没那么简单

C#调用interface与fanuc机器人通信 由于项目需要利用C#做上位机与FANUC机器人进行通讯,用的是fanuc的interface。网上相关资料比较少,摸索之后整理出这篇文章,希望对大家有所帮助。 阅读详情

来自:http://www.cnblogs.com/Ivony/archive/2010/05/17/1737037.html

最近在园子里闲逛看到一篇文章“(抽象)类和接口细节分析”,尽管作者很细心很细致。可事实上C#里面的interface没那么简单,interface有着大量不为人知的小秘密的说。

1、值类型也能实现接口。

尽管可能很多人连值类型都没用过,但值类型可以实现接口,是一个非常有用的特性。当值类型转换为接口类型时,会自动装箱成引用类型从而实现多态,但一般用值类型实现接口的老鸟都不会被这些小陷阱所迷惑的。

2、除了接口,没有什么类型可以不实现接口

抽象类可以不实现接口?其实不然,抽象类只能抽象接口的实现,即将实现变为abstract的,但不能不实现接口。也许你会疑惑,abstract实现接口成员和不实现接口成员到底有区别?尽管区别不大,但还是存在的,从理论上来说的话,就是slot上的方法的区别。抽象类用abstract成员实现接口后,子类再override来实现抽象类的abstract成员,这会使得子类的实现是在abstract实现之下而不是直接在接口成员之下。从实际效果上来说,由于抽象类的abstract的实现存在,使得子类中可以选择对抽象类和接口进行分别实现(重新实现接口)。

3、但事实上接口也不能实现接口,只是把多个接口捆绑起来。

一段有趣的代码如下

public interface IA
{
  void Test();
}

public interface IB : IA { }

public interface IC : IA { }

public interface ID : IB, IC { }

 

当实现ID时,等于同时实现ID、IC、IB和IA,但事实上,你只需要实现一个Test方法,也只能实现一个Test方法,也就是IA.Test,IB、IC、ID都是没有Test方法的。

当然,你可以尝试在IB或是其他接口中再放入一个Test,便会产生一些奇妙的事情。

4、同一接口成员在同一类型中只能被实现一次。

显示实现接口已经不是什么秘密了,但很多人却并不知道,如果你显示实现了接口,那么隐式实现就不存在了。这就是接口只能被实现一次:

public interface IA
{
  void Test();
}

public interface IB
{
  void Test();
}


public class TestClass : IA, IB
{

  public void Test()
  {
    throw new NotImplementedException();
  }

  void IB.Test()
  {
    throw new NotImplementedException();
  }
}

在这段代码中,第一个Test方法实际上只实现了IA.Test,而如果将第二个Test方法去掉,则第一个方法就会同时实现两个Test,即IA.Test和IB.Test。不妨自己动手去试一下。

5、同一个类型也只能实现同一个接口一次。

其实不论类型的父类重复实现了同一个接口多少次,一个类型只能实现一个接口一次。考虑下面的代码:

public interface ITest
{
  void Test();
}

public abstract class Test1 : ITest
{
  public void Test()
  {
    throw new NotImplementedException();
  }
}

public abstract class Test2 : Test1, ITest
{
  public new void Test()
  {
    throw new NotImplementedException();
  }
}

public abstract class Test3 : Test2, ITest
{
  public new void Test()
  {
    throw new NotImplementedException();
  }
}

 

无论在基类中实现了多少次ITest接口,事实上在ITest3的接口列表中永远只有一个ITest(GetInterfaces),也只能对ITest的每个成员实现一次(隐式或显式)。

6、实现接口的成员实际可见性总是不低于接口可见性。显示实现接口的成员可见性总是等同于接口可见性(因为它们默认都是private的)。

重写基类成员的成员必须有相同的可见性,接口则不必,隐式实现总是要求成员必须为public。同时,一个类型可以实现可见性比自己高或低的接口,但不能继承可见性比自己低的基类。

因为能访问到接口的类型的地方一定能访问到接口的实现成员,所以实现接口的成员的实际可见性总不低于接口。

一个很常见的手法,一个可见性较低的类型通过可见性高的接口来暴露自己的成员,事实几乎所有的枚举器(IEnumerator的实例)都是private的类型,透过接口来暴露功能。

当然,你也可以设计一个internal的接口,然后让某个类型去“显示实现”,这个时候实现接口的成员的“实际”可见性将跟随接口变为internal。

由于隐式实现接口要求成员必须是public的,如果要用可见性较低的接口来制约成员可见性就只能用显式实现接口成员。也许有人会很奇怪我干嘛降级成员的可见性?因为有时候可见性高了并不是什么好事,它会破坏组件(不是类型)的封装。当然更多的时候,我们只是需要一个手段来统一设置某些成员的可见性。

不过,我们也能想出更多非常好玩的玩法:

public abstract class Test
{
  protected interface ITest
  {
    void Test();
  }

  public class Nested : ITest
  {

    void ITest.Test()
    {
      throw new NotImplementedException();
    }
  }
}

 

这也是显示实现接口特性除了解决名称和冲突问题之外最大的用处。

 

C#中 什么是接口Interface,以及如何简单使用 接口是指定一组函数成员而不实现他们的引用类型。所以只能类和结构来实现接口,在继承该接口的类里面要实现接口的所有方法。 一、 在定义接口时候要注意如下几点: 1.接口生命不能包含以下成员: 数据成员、静态成员。 2.接口声明只能包含如下类型的非静态成员函数的声明: 方法、属性、事件、索引器。 3.这些函数成员的声明不能包含任何实现代码,而在每一个成员声明的主体后必须使用分。 阅读详情

相关推荐

C#开发——接口Interface

C#开发接口Interface

青岚岁叶的博客 757

如何知道一个类都实现了哪些接口和从那个类继承 (C#)

可能的情况有:从一个类继承,从一个或多个接口继承,从一个类和一个或多个接口继承。使用Type类的BaseType属性来取得类从哪个类继承。GetInterfaces方法来取得类都实现了哪些接口。测试代码如下:类库代码: using?System;namespace?GetInterface{??public?class?Class1?:?Class2,BaseInterface,BaseInt

1235

OGG故障指南:OGG-01163 Bad column length (xxx) specified for column

OGG-01163 Bad column length (xxx) specified for column AAA in table OWNER.TABLE, maximum allowable length is yyy

qqqyyy0422的博客 717

反射获取父类和接口

223

weixin_50125130的博客 583

kali虚拟机-----破解wifi密码(WiFi渗透)

文章目录一、将无线网卡挂载到 虚拟机上二、查看是否挂载成功三、查看网卡是否支持监听模式四、检查文件监听影响并杀死影响五、开启无线监听模式六、开始监听七、开始抓包(新建一个命令窗口)八、对已连接的终端进行攻击,使它掉线重连,以此来获取数据包。(新建一个命令窗口)九、开始解密 一、将无线网卡挂载到 虚拟机上 可能出现的问题:在可移动设备处无法连接无线网卡; 解决:在虚拟机设置中将usb控制器设置成如图所示。 注意要先关闭虚拟机在设置。 二、查看是否挂载成功 使用ifconfig命令查看 三、查看网卡是

weixin_46471800的博客 1万+

YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线

本项目实现了一个基于YOLOv8和TensorRT的高性能火灾烟雾检测系统,具有以下核心特点: 技术架构:采用TensorRT 8.6+进行GPU加速推理,结合CUDA 12.1和OpenCV 4.8+,实现高效计算机视觉处理。系统使用XMake替代CMake构建,配置更简洁高效。

hscing的博客 1065

在C#中判断类是否继承某个类或接口

在C#中,有时我们需要判断一个类是否继承自某个基类或实现了某个接口。这种需求在反射(Reflection)机制中尤为常见,反射允许我们在运行时动态地获取类型的信息。本文将详细介绍如何在C#中判断一个类是否继承某个类或接口,并提供示例代码。使用is和as关键字在C#中,is运算符可以用于检查对象是否兼容于某个类型,as运算符则用于安全地将对象转换为某个类型。不过,is和as主要用于实例对象,而不是类...

dotNET跨平台 1441

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

C#中的interface没那么简单【转】

最近在园子里闲逛看到一篇文章“(抽象)类和接口细节分析”,尽管作者很细心很细致。可事实上C#里面的interface没那么简单,interface有着大量不为人知的小秘密的说。   1、值类型也能实现接口。 尽管可能很多人连值类型都没用过,但值类型可以实现接口,是一个非常有用的特性。当值类型转换为接口类型时,会自动装箱成引用类型从而实现多态,但一般用值类型实现接口的老鸟都不会被这些小陷阱所迷

萌萌的It人 www.itmmd.com 779

arduino uno spi驱动12864

arduino uno spi驱动12864

yvee的博客 2060

FICO F.27 Customer statement 打印

需求,定制化打印,替换标准的F.27打印 类似于采购订单的打印,但是略有不同,查阅资料之后步骤如下: T-code F.27 is SAP standard program to produce customer/vendor correspondence (letter). Correspondence Type is used to specify the related printing program and form for the particular correspondence. SAP

IamRunjiang的博客 1963

c# interface 的理解(工厂模式)简单实例

由于昨天在一个大公司面试,被c#中的一个interface给难住了,所以回来以后我就找了这些资料看了一下,有了一点感觉。记录下来,方便以后使用。c# interface定义:就是以前使用的类似于 API 的东西,别人告诉你一个类型,你在心得开发过程中可以使用。比如:  interface ITest  {   string iText();  }  class Test:I

孤剑之家 1万+

【心电信号】基于多种滤波去除心电信号基线漂移含Matlab源码

1 简介 心电信号可以用来检测和诊断心脏疾病,心电信号在采集时经常受到呼吸活动、身体运动和皮肤与电极接触不良等影响,因此会产生基线漂移,基线漂移的存在会降低心电信号的质量。所以,在大多数心电信号处理中,包括心律失常的识别、心率变化分析和连续血压测量等,去除基线漂移成为了至关重要的一步。心电信号具有非平稳、非线性的特性,传统的去除心电信号中基线漂移的方法在对心电信号进行去噪时常因去噪过度或者不完全,容易造成大量非线性特征信息的丢失,从而破坏了心电信号本身的动力学特性,这给后续的心电信号信息分析带来了不利影响

qq_59747472的博客 2208

C#中的class和interface

C#中的class namespace Class和interface { class Program { static void Main(string[] args) { Person person = new Person(); Console.WriteLine(person.GetAge(1)); //调用时使用实例化的对象调用 Console.Writ

闰土月下追猹 1040

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

念兮为美 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# 学习笔记(十五)C# 中的interface

在好多编译原因中,interface里面是可以声明方法的,编译器会识别interface,并编译里面的成员方法。在C#中也有interface。 概述 C# 中的interface称为“接口”,之所以称之为接口是因为在C# 中,interface可以声明一个专门去定义成员方法的x,而且被定义的这个x是可以被继承的,C#中称作接口继承。 定义接口 interface XXXInterfa...

竹毛言己 459

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: SQL时间戳使用之任务循环
下一篇: (抽象)类和接口细节分析
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值