对接口成员的访问

C#——接口的实战练习(访问接口的成员) 通过这个练习,将了解几个问题 (1)访问接口成员的两种方法及适用情况 (2)测试对象是否支持接口的两种方式as与is的区别 设计界面: 编写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.D... 阅读详情
对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:

using System ;
interface ISequence {
    int Count { get; set; }
}
interface IRing {
    void Count(int i) ;
}
interface IRingSequence: ISequence, IRing { }
class CTest {
    void Test(IRingSequence rs) {
        //rs.Count(1) ;  错误, Count 有二义性
        //rs.Count = 1;   错误, Count 有二义性
        ((ISequence)rs).Count = 1;  // 正确
((IRing)rs).Count(1) ; // 正确调用IRing.Count
    }
}


上面的例子中,前两条语句rs.Count(1)和rs.Count=1会产生二义性,从而导致编译时错误,因此必须显式地给rs 指派父接口类型,这种指派在运行时不会带来额外的开销。

再看下面的例子:

using System ;
interface IInteger {
    void Add(int i) ;
}
interface IDouble {
    void Add(double d) ;
}
interface INumber: IInteger, IDouble {}
class CMyTest {
    void Test(INumber Num) {
        // Num.Add(1) ; 错误
        Num.Add(1.0) ; // 正确
        ((IInteger)n).Add(1) ; // 正确
        ((IDouble)n).Add(1) ; // 正确
    }
}


调用Num.Add(1) 会导致二义性,因为候选的重载方法的参数类型均适用。但是,调用Num.Add(1.0) 是允许的,因为1.0是浮点数参数类型与方法IInteger.Add()的参数类型不一致,这时只有IDouble.Add 才是适用的。不过只要加入了显式的指派,就决不会产生二义性。

接口的多重继承的问题也会带来成员访问上的问题。例如:

interface IBase {
    void FWay(int i) ;
}
interface ILeft: IBase {
    new void FWay (int i) ;
}
interface IRight: IBase
{  void G( ) ; }
interface IDerived: ILeft, IRight { }
class CTest {
    void Test(IDerived d) {
        d. FWay (1) ; // 调用ILeft. FWay
        ((IBase)d). FWay (1) ; // 调用IBase. FWay
        ((ILeft)d). FWay (1) ; // 调用ILeft. FWay
        ((IRight)d). FWay (1) ; // 调用IBase. FWay
    }
}


上例中,方法IBase.FWay在派生的接口ILeft中被Ileft的成员方法FWay覆盖了。所以对d. FWay (1)的调用实际上调用了。虽然从IBase-> IRight-> IDerived这条继承路径上来看,ILeft.FWay方法是没有被覆盖的。我们只要记住这一点:一旦成员被覆盖以后,所有对其的访问都被覆盖以后的成员"拦截"了。

类对接口的实现


前面我们已经说过,接口定义不包括方法的实现部分。接口可以通过类或结构来实现。我们主要讲述通过类来实现接口。用类来实现接口时,接口的名称必须包含在类定义中的基类列表中。

下面的例子给出了由类来实现接口的例子。其中ISequence为一个队列接口,提供了向队列尾部添加对象的成员方法Add( ),IRing 为一个循环表接口,提供了向环中插入对象的方法Insert(object obj),方法返回插入的位置。类RingSquence 实现了接口ISequence 和接口IRing。

using System ;
interface ISequence {
    object Add( ) ;
}
interface ISequence {
    object Add( ) ;
}
interface IRing {
    int Insert(object obj) ;
}
class RingSequence: ISequence, IRing
{
    public object Add( ) {…}
    public int Insert(object obj) {…}
}


如果类实现了某个接口,类也隐式地继承了该接口的所有父接口,不管这些父接口有没有在类定义的基类表中列出。看下面的例子:

using System ;
interface IControl {
	void Paint( );
}
interface ITextBox: IControl {
	void SetText(string text);
}
interface IListBox: IControl {
	void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox { }


这里,接口IcomboBox继承了ItextBox和IlistBox。类TextBox不仅实现了接口ITextBox,还实现了接口ITextBox 的父接口IControl。

前面我们已经看到,一个类可以实现多个接口。再看下面的例子:

interface IDataBound {
	void Bind(Binder b);
}
public class EditBox: Control, IControl, IDataBound {
	public void Paint( );
	public void Bind(Binder b) {...}
}


类EditBox从类Control中派生并且实现了Icontrol和IdataBound。在前面的例子中接口Icontrol中的Paint方法和IdataBound接口中的Bind方法都用类EditBox中的公共成员实现。C#提供一种实现这些方法的可选择的途径,这样可以使执行这些的类避免把这些成员设定为公共的。接口成员可以用有效的名称来实现。例如,类EditBox可以改作方法Icontrol.Paint和IdataBound.Bind来来实现。

public class EditBox: IControl, IDataBound {
	void IControl.Paint( ) {...}
	void IDataBound.Bind(Binder b) {...}
}


因为通过外部指派接口成员实现了每个成员,所以用这种方法实现的成员称为外部接口成员。外部接口成员可以只是通过接口来调用。例如,Paint方法中EditBox的实现可以只是通过创建Icontrol接口来调用。

class Test {
	static void Main( ) {
		EditBox editbox = new EditBox( );
		editbox.Paint( );	//错误: EditBox 没有Paint 事件
		IControl control = editbox;
		control.Paint( );	// 调用 EditBox的Paint事件
	}
}


上例中,类EditBox 从Control 类继承并同时实现了IControl and IDataBound 接口。EditBox 中的Paint方法来自IControl接口,Bind方法来自IDataBound接口,二者在EditBox类中都作为公有成员实现。当然,在C# 中我们也可以选择不作为公有成员实现接口。

如果每个成员都明显地指出了被实现的接口,通过这种途径被实现的接口我们称之为显式接口成员(explicit interface member)。 用这种方式我们改写上面的例子:

public class EditBox: IControl, IDataBound {
    void IControl.Paint( ) {…}
    void IDataBound.Bind(Binder b) {…}
}


显式接口成员只能通过接口调用。例如:

class CTest {
    static void Main( ) {
        EditBox editbox = new EditBox( ) ;
        editbox.Paint( ) ; //错误:不同的方法
        IControl control = editbox;
        control.Paint( ) ; //调用 EditBox的Paint方法
    }
}


上述代码中对editbox.Paint()的调用是错误的,因为editbox本身并没有提供这一方法。control.Paint( )是正确的调用方式。

注释:接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其它接口的支持。

知道了怎样访问接口,我们还要知道怎样实现接口,这部分内容我们将在下一篇文章中详细讲述。 
 
国产数据库PolarDB-X实战:5分钟快速搭建本地开发环境(附Docker一键部署脚本) 本文提供了一份详尽的国产分布式数据库PolarDB-X本地开发环境搭建指南。通过Docker Compose一键部署脚本,开发者可在5分钟内快速启动一个功能完整的PolarDB-X实例,涵盖环境准备、脚本解析、连接验证及日常维护,极大简化了国产数据库的入门和体验流程。 阅读详情

相关推荐

WiseFlow本地搭建实录---保姆教程

本文介绍了如何从0开始搭建wiseflow的个人情报官的方法,目前所有的API全部都是免费的,对机器没有要求,大家可以放心搭建

liuhui244的博客 1962

java多态

访问成员变量的两种方式: 1)直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找 2)间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找 编译看左,运行还看左 成员方法:在多态代码中,成员方法的访问规则:看new的是谁,就优先用谁,没有则向上找 编译看左,运行看右 ...

Entropy 146

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 336

全面剖析C#接口编程之对接口成员的访问

        对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义: using System ;interface ISequence {

八戒也编程 971

携程登录风控逆向踩坑实录:从滑块到点选验证码,我是如何一步步拿到phantom-token的

本文详细解析了携程登录风控系统的逆向过程,从滑块验证码到点选验证码的破解,再到设备指纹生成和加密协议逆向,最终成功获取phantom-token。文章提供了关键代码示例和实战技巧,帮助开发者理解并绕过复杂的风控机制。

weixin_28049429的博客 972

YOLOv12涨点改进 | 独家创新-注意力改进篇 | ECCV 2024 | YOLOv12引入AgentAttention代理注意力模块,兼顾 Softmax 和线性注意力优点,提高检测精度

🔥本文给大家介绍使用Agent Attention模块改进YOLOv12网络模型。其主要作用是通过引入高效的代理token来减少计算复杂度,同时保留全局上下文建模能力。相比传统的Softmax注意力,Agent Attention通过代理token聚合并广播信息,从而降低了模型在处理高分辨率图像时的计算负担,并显著提高了推理速度。其优势在于保持了目标检测中的全局信息处理能力,同时加速了生成过程,特别是在高分辨率场景下,可以提高检测精度、减少内存消耗,并提升处理速度。

Ai缝合怪、助力小伙伴高效发论文 155

建议:通过接口引用对象。

应该优先使用接口而不是类来引用对象。如果有适合的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明。只有当你利用构造器创建某个对象的时候,才真正需要引用这个对象的类。 如果你养成了用接口作为类型的习惯,你的程序将会更加灵活。 有一点值得注意:如果原来的实现提供了某种特殊的功能,而这种功能并不是这个接口的通用约定所要求的...

孤芳不自赏 2674

软件测试高频面试题 2026 最新整理(功能 + 自动化)

本文系统整理了2026年软件测试面试高频题目及参考答案,涵盖功能测试、自动化测试及新兴热点领域。功能测试部分包含测试基础概念、用例设计方法、缺陷管理流程等10个必背题;自动化测试部分详细解析工具选择、元素定位、框架搭建等10个热门考点;新增章节聚焦AI测试、安全测试、性能指标等5个前沿话题。参考答案均采用结构化表述,包含定义、区别、适用场景等关键要素,并强调结合项目经验作答。文末提供2026版面试技巧,建议采用"结论-分点-总结"的回答逻辑,重点展现问题解决能力和技术前瞻性。

SmallBull的博客 1968

接口中写成员变量

今天又看到了一种新的写法,在接口中写成员变量相当于在类中用public final static 来定义。interface中默认的成员变量修饰是public final static

qq_27631217的博客 1230

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1488

H3C交换机命令大全,分模块好记忆!

在深入命令之前,我们先来了解H3C交换机的命令行基础。<H3C>[H3C]常用基础命令如下:这些基础命令是操作H3C交换机的敲门砖,熟练掌握后,我们将按模块深入探讨更具体的配置命令。H3C交换机的命令可以按功能模块分类,包括系统管理、接口配置、VLAN操作、链路聚合、路由配置、安全管理等。

网络技术联盟站 783

C#的接口基础教程之四 访问接口

对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:using System ;interface ISequence {...

adiking520110的博客 192

Google Earth Engine 红树林制图方法的代码(三个模块)

谷歌地球引擎红树林制图方法(GEM)提供了一种直观、易用且可复制的工具,适用于广泛的非专业沿海管理者和决策者。该工具全面回顾并整合了相关的红树林遥感文献,并利用云计算的力量,包括简化的基于图像的潮汐校准方法。GEM 可免费用于非营利用途,并在 GEE 中运行,包含全面且详细注释的代码。GEM 专门设计用于绘制全球范围内多日期红树林分布并量化其动态变化。目前可用的工具和方法未能充分利用沿海管理者通常持有的丰富地方专业知识——GEM 致力于填补这一空白,帮助结合地方专业知识与 GEE 的云计算能力。

此星光明博客 560

C#教程--访问接口

第四节、访问接口   对接口成员的访问  对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:using System ;interface ISeque

lovelulin的专栏 720

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c# 接口的访问

对接口成员的访问  对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:using System ;interface ISequence { int C...

weixin_34245749的博客 98

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

黑马程序员 对访问器的访问修饰符的限制

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 对属性或索引器使用访问修饰符受以下条件的制约: 不能对接口或显式接口成员实现使用访问器修饰符。 仅当属性或索引器同时具有 set 和 get 访问器时,才能使用访问器修饰符。这种情况下,只允许对其中一

yuanlianxi03的专栏 529

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

第1节 C#2.0新特性之五:非对称访问器可访问性

 非对称访问器可访问性        属性或索引器的 get 和 set 部分称为“访问器”。默认情况下,这些访问器具有相同的可见性或访问级别:其所属属性或索引器的可见性或访问级别。有关更多信息,请参见可访问性级别。不过,有时限制对其中某个访问器的访问会很有用。通常是在保持 get 访问器可公开访问的情况下,限制 set 访问器的可访问性。例如:C# 复制代码pub

powersea2的专栏 398

.Net 2.0 新功能:属性访问器可访问性(Property Accessor Accessibility)

&lt;!--[if !supportLists]--&gt;1. 属性或索引器的get和set部分称为“访问器”。默认情况下,这些访问器具有相同的可见性或访问级别(其所属属性或索引器的可见性或访问级别)。&lt;!--[endif]--&gt; &lt;!--[if !supportLists]--&gt;2. 有时候需要限制对其中某个访问器的访问会很有用。比如需要可以任何访问get,但set...

hunxiejun 133

基于C#的接口基础教程之四

    第四节、访问接口        对接口成员的访问        对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:            usi

805

接口总结

------------------ 接口总结 1. 接口是一个引用类型,通过接口可以实现多重继承。 2. C#中接口有new、public、protected、internal、private等修饰符。 3. 接口中只能声明抽象成员(所以不能直接对接口进行

游戏小土匪 500

C++学习之路,从0到精通的征途:string类的模拟实现

在函数体内初始化_str,new一个size+1大小的连续空间,用来存放给定的字符串的‘\0’,申请完空间后,最后将给定字符串中的数据按字节拷贝给_str。如果在这里不写拷贝构造,那么编译器则会调用默认的拷贝构造来进行浅拷贝,则会导致同一块空间被析构两次,所以这里需要手动写深拷贝,并将数据按字节转移到新对象中。这里用s1的成员变量_str构造tmp,再将tmp和s2交换swap,这样tmp中的成员变量就与s2中的成员变量交换,出函数体后tmp同时也会被析构。当n>capacity,先进行扩容,再插入数据。

ll778811的博客 935

十分钟速通集群

本文以华为CE12800设备为例介绍框式交换机集群操作。集群通过堆叠线缆将多台交换机虚拟成单一设备,包含管理链路和业务链路两种连接方式。文章详细说明了两链路分离或合一的配置方案,推荐使用分离方式确保高可靠性。同时阐述了堆叠成员ID对接口编号的影响机制,以及堆叠与非堆叠环境下文件系统访问路径的差异,包括Flash存储器的命名规则变化。最后指出其余操作与常规堆叠配置基本一致。

ACL 430

java中类与接口

无

weixin_62646853的博客 1124

TypeScript学习-第6章:类(Class)

各位前端工友们,上一章咱们搞定了接口——这个“代码世界的契约书”,明确了复杂结构的约束规则。但契约终究是“纸上条文”,得有具体的“执行者”来落地逻辑、封装数据。这一章咱们就解锁TS面向对象的核心载体——类(Class),让接口的契约“活”起来。 纯JS里的类更像“简单模板”,能生成实例但缺乏严格约束;而TS的类,是“带类型校验的强化模板”——既继承了JS类的封装、继承特性,又结合TS类型系统,给属性、方法加了精准约束,还能和接口绑定,让面向对象编程更严谨、更可控。咱们就从基础到高级,一步步吃透TS类的玩法

Amon的专栏 902
上一篇: 接口成员的显示实现
下一篇: C#接口之接口定义
NETZHOU
博客等级 码龄24年 10粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值