接口成员的显示实现

C#隐式实现接口成员与显示实现接口成员(C# 接口实现的方式) C# 接口实现的方式 C#在类中实现接口。实现接口的类必须包含该接口的所有成员的实现代码,且都是公共的。实现接口成员有隐式实现和显式实现两种方法。 1. 隐式实现 如下图所示,类MyClass隐式地实现了接口IMyInterface的DoSomething和DoSomethingElse两个方法。对于隐式实现的成员,既可以通过类对象实例来访问,也可以通过接口来访问。如Main函数所示,两种调用方法都能成功。 <span style="font-size:12px;">namespace Ch10 阅读详情
(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。在前面的文章中,我们已经对C#接口的概念,如何定义接口以及如何对接口进行访问等问题进行了详细的讨论。在这些知识的基础上,本文我们将来了解实现接口的方法。

 

显式实现接口成员

为了实现接口,类可以定义显式接口成员执行体(Explicit interface member

implementations)。显式接口成员执行体可以是一个方法、一个属性、一个事件或者是一个索引指示器的定义,定义与该成员对应的全权名应保持一致。

using System ;
interface ICloneable {
    object Clone( ) ;
}
interface IComparable {
    int CompareTo(object other) ;
}
class ListEntry: ICloneable, IComparable {
    object ICloneable.Clone( ) {…}
    int IComparable.CompareTo(object other) {…}
}

上面的代码中ICloneable.Clone 和IComparable.CompareTo 就是显式接口成员执行体。

说明:

· 不能在方法调用、属性访问以及索引指示器访问中通过全权名访问显式接口成员执行体。事实上,显式接口成员执行体只能通过接口的实例,仅仅引用接口的成员名称来访问。

· 显式接口成员执行体不能使用任何访问限制符,也不能加上abstract, virtual, override或static 修饰符。

· 显式接口成员执行体和其他成员有着不同的访问方式。因为不能在方法调用、属性访问以及索引指示器访问中通过全权名访问,显式接口成员执行体在某种意义上是私有的。但它们又可以通过接口的实例访问,也具有一定的公有性质。

· 只有类在定义时,把接口名写在了基类列表中,而且类中定义的全权名、类型和返回类型都与显式接口成员执行体完全一致时,显式接口成员执行体才是有效的,例如:

class Shape: ICloneable {
    object ICloneable.Clone( ) {…}
    int IComparable.CompareTo(object other) {…}
}

使用显式接口成员执行体通常有两个目的:

· 因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。

· 显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。

下面的定义是无效的,因为Shape 定义时基类列表中没有出现接口IComparable。

class Shape: ICloneable
{
    object ICloneable.Clone( ) {…}
}
class Ellipse: Shape
{
    object ICloneable.Clone( ) {…}
}

在Ellipse中定义ICloneable.Clone是错误的,因为Ellipse即使隐式地实现了接口ICloneable,ICloneable仍然没有显式地出现在Ellipse定义的基类列表中。

接口成员的全权名必须对应在接口中定义的成员。如下面的例子中,Paint的显式接口成员执行体必须写成IControl.Paint。

using System ;
interface IControl
{
    void Paint( ) ;
}
interface ITextBox: IControl
{
    void SetText(string text) ;
}
class TextBox: ITextBox
{
    void IControl.Paint( ) {…}
    void ITextBox.SetText(string text) {…}
}

实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。显式接口实现还允许程序员继承共享相同成员名的两个接口,并为每个接口成员提供一个单独的实现。

下面例子中同时以公制单位和英制单位显示框的尺寸。Box类继承IEnglishDimensions和IMetricDimensions两个接口,它们表示不同的度量衡系统。两个接口有相同的成员名 Length 和 Width。

程序清单1  DemonInterface.cs
interface IEnglishDimensions  {
   float Length ( ) ;
   float Width ( ) ;
}
interface IMetricDimensions {
   float Length ( ) ;
   float Width ( ) ;
}
class Box : IEnglishDimensions, IMetricDimensions {
   float lengthInches ;
   float widthInches ;
   public Box(float length, float width) {
      lengthInches = length ;
      widthInches = width ;
   }
   float IEnglishDimensions.Length( ) {
      return lengthInches ;
   }
   float IEnglishDimensions.Width( ) {
      return widthInches ;      
   }
   float IMetricDimensions.Length( ) {
      return lengthInches * 2.54f ;
   }
   float IMetricDimensions.Width( ) {
      return widthInches * 2.54f ;
   }
   public static void Main( ) {
      //定义一个实类对象 "myBox"::
      Box myBox = new Box(30.0f, 20.0f);
      // 定义一个接口" eDimensions"::
      IEnglishDimensions eDimensions = (IEnglishDimensions) myBox;
      IMetricDimensions mDimensions = (IMetricDimensions) myBox;
      // 输出:
      System.Console.WriteLine(" Length(in): {0}", eDimensions.Length( ));
      System.Console.WriteLine(" Width (in): {0}", eDimensions.Width( ));
      System.Console.WriteLine(" Length(cm): {0}", mDimensions.Length( ));
      System.Console.WriteLine(" Width (cm): {0}", mDimensions.Width( ));
   }
}

输出:Length(in): 30,Width (in): 20,Length(cm): 76.2,Width (cm): 50.8

代码讨论:如果希望默认度量采用英制单位,请正常实现 Length 和 Width 这两个方法,并从 IMetricDimensions 接口显式实现 Length 和 Width 方法:

public float Length( ) {
   return lengthInches ;
}
public float Width( ){
   return widthInches;
}
float IMetricDimensions.Length( ) {
   return lengthInches * 2.54f ;
}
float IMetricDimensions.Width( ) {
   return widthInches * 2.54f ;
}

这种情况下,可以从类实例访问英制单位,而从接口实例访问公制单位:

System.Console.WriteLine("Length(in): {0}", myBox.Length( )) ;
System.Console.WriteLine("Width (in): {0}", myBox.Width( )) ;    
System.Console.WriteLine("Length(cm): {0}", mDimensions.Length( )) ;
System.Console.WriteLine("Width (cm): {0}", mDimensions.Width( )) ;

 

继承接口实现

接口具有不变性,但这并不意味着接口不再发展。类似于类的继承性,接口也可以继承和发展。

注意:接口继承和类继承不同,首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。

接口可以从零或多个接口中继承。从多个接口中继承时,用":"后跟被继承的接口名字,多个接口名之间用","分割。被继承的接口应该是可以访问得到的,比如从private类型或internal类型的接口中继承就是不允许的。接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构。

请看下面的例子:

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

对一个接口的继承也就继承了接口的所有成员,上面的例子中接口ITextBox和IListBox都从接口IControl中继承,也就继承了接口IControl的Paint方法。接口IComboBox从接口ITextBox和IListBox中继承,因此它应该继承了接口ITextBox的SetText方法和IListBox的SetItems方法,还有IControl的Paint方法。

一个类继承了所有被它的基本类提供的接口实现程序。

不通过显式的实现一个接口,一个派生类不能用任何方法改变它从它的基本类继承的接口映射。例如,在声明中:

interface IControl {
	void Paint( );
}
class Control: IControl {
	public void Paint( ) {...}
}
class TextBox: Control {
	new public void Paint( ) {...}
}

TextBox中的方法Paint隐藏了Control中的方法Paint,但是没有改变从Control.Paint到IControl.Paint 的映射,而通过类实例和接口实例调用Paint将会有下面的影响。

Control c = new Control( ) ;
TextBox t = new TextBox( ) ;
IControl ic = c ;
IControl it = t ;
c.Paint( ) ;			// 影响Control.Paint( ) ;
t.Paint( ) ;			// 影响TextBox.Paint( ) ;
ic.Paint( ) ;			// 影响Control.Paint( ) ;
it.Paint( ) ;			// 影响Control.Paint( ) ;

但是,当一个接口方法被映射到一个类中的虚拟方法,派生类就不可能覆盖这个虚拟方法并且改变接口的实现函数。例如,把上面的声明重新写为:

interface IControl {
	void Paint( ) ;
}
class Control: IControl {
	public virtual void Paint( ) {...}
}
class TextBox: Control {
	public override void Paint( ) {...}
}

就会看到下面的结果:

Control c = new Control( ) ;
TextBox t = new TextBox( ) ;
IControl ic = c ;
IControl it = t ;
c.Paint( ) ;			// 影响Control.Paint( );
t.Paint( ) ;			// 影响TextBox.Paint( );
ic.Paint( ) ;			// 影响Control.Paint( );
it.Paint( ) ;			// 影响TextBox.Paint( );

由于显式接口成员实现程序不能被声明为虚拟的,就不可能覆盖一个显式接口成员实现程序。一个显式接口成员实现程序调用另外一个方法是有效的,而另外的那个方法可以被声明为虚拟的以便让派生类可以覆盖它。例如:

interface IControl {
	void Paint( ) ;
}
class Control: IControl {
	void IControl.Paint( ) { PaintControl( ); }
	protected virtual void PaintControl( ) {...}
}
class TextBox: Control {
	protected override void PaintControl( ) {...}
}

这里,从Control继承的类可以通过覆盖方法PaintControl来对IControl.Paint的实现程序进行特殊化。

使用getResourceAsStream()时,必须给定一个URL,由于我们要存取JAR内部的资源,如果使用「/」作为开头,代表绝对路径,「/」代表JAR文件之中的根目录。如果没有使用「/」,则视为相对路径,要看调用getResourceAsStream()类别的所在路径而定,这样容易造成混淆。所以请尽量使用「/」作为开头的绝对路径。

 

MIDlet的程序结构

如果曾经撰写过Java Applet或Java Servlet,就知道制作Java Applet,必须继承自java.applet.Applet这个类别;制作Java Servlet,则程序必须继承自javax.servlet. http.HttpServlet这个类别。同理,要撰写能够在手机上执行的Java MIDlet必须要继承自javax.microedition.midlet. MIDlet类别,如图8所示。

 

 

图8 MIDlet继承体系图

javax.microedition.midlet.MIDlet类别中定义了三个抽象方法,它们分别是:startApp() ==> 至运作状态;pauseApp() ==> 至停止状态;destoryApp() ==> 至消灭状态。应用程序管理员就是透过这三个抽象方法来控制MIDlet的生命周期。因此,所有的MIDlet都必须实现这三个方法,才保证能正常运作。因此,一个MIDlet的程序外壳至少要如下:

import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
 public HelloMIDlet() 
 {
  //建构式
 }
 public void startApp() 
 {
 }
 public void pauseApp() 
 {
 }
 public void destroyApp(boolean unconditional) 
 {
 }
}

根据MIDP规格,MIDlet中不应该有“public static void main(Straing[] args)”这个方法。如果有则应用程序管理员会忽略不管。

一旦MIDlet被JAM载入之后,首先会先呼叫MIDlet中没有参数的建构式以进行初始化的工作。如果熟悉Java语法一定知道Java语言的一些特性,就是如果没有在程序中加入任何建构式,编译器会自动帮助加入一个预设建构式。但是如果已经撰写了自己的建构式(有任何参数),那么编译器将不会自动帮助加上预设建构式。因此,如果有必要撰写有参数的建构式,别忘了再手动加上一个没有参数的建构式,否则MIDlet将无法正确地初始化。

 

MIDlet的起始行为

当MIDlet被应用程序管理员产生之后,MIDlet就开始运作,程序设计师应该做的事情如图9所示。

 

 

图9 MIDlet起始行为图

我们会使用Display.getDisplay(this)来取得代表该MIDlet显示屏的Display对象。从应用程序管理员呼叫startApp()到MIDlet结束运作这段时间之内,不管何时呼叫Display.getDisplay(this),取得的都是同一份Display对象的参考。

要设定显示在屏幕上的画面,会使用Display对象的参考,并调用其setCurrent()方法,即display.setCurrent( Displayable类别的子类别实体)。因此一个可以运作的MIDlet程序,至少如HelloMIDlet.java,代码为:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloMIDlet extends MIDlet
{
 private Display display;	
 public HelloMIDlet() 
 {
  display = Display.getDisplay(this);
 }
 public void startApp() 
 {
  Form t = new Form("画面");
  display.setCurrent(t);
 }
 public void pauseApp() 
 {
 }
 public void destroyApp(boolean unconditional) 
 {
 }
}

注意:根据规格MIDlet只能由应用程序管理员产生,我们不能自己在程序里生成其它的MIDlet,并呼叫其生命周期函数,这样做将引发SecurityException异常。

 

MIDlet的生命周期

前面简单地叙述了应该如何撰写一个MIDlet的轮廓。但事实上,MIDlet的运作稍微复杂一点。所以接下来要仔细探讨MIDlet的运作细节,也就是MIDlet的生命周期。

当MIDlet被应用程序管理员成功地初始化之后,就开始展开了它的生命周期。图10描述了一个MIDlet的生命周期。MIDlet的生命周期完全由应用程序管理员控制,也就是说,当MIDlet要从一个状态变成另外一个状态时,应用程序管理员会呼叫对应的回呼函数(Call Back,也就是MIDlet类别定义的那三个抽象方法)。MIDlet基本上有三种状态,分别是停止状态(Paused)、启动状态(Active)及毁灭状态(Destroyed)。MIDlet开始时一定是先进入停止状态,然后应用程序管理员再将它转换成启动状态,然后调用startApp(),见图10。只有当应用程序管理员认为MIDlet的状态必须改变时,才会呼叫图中的相关函数。

 
从零配置Archery:手把手教你用Docker部署多数据库审核系统(MySQL/PostgreSQL/ClickHouse) 本文详细介绍了如何从零开始使用Docker部署Archery多数据库审核系统,涵盖MySQL、PostgreSQL和ClickHouse的配置与整合。文章提供了生产级Docker-compose配置、审核规则定制、工单流程设置以及企业微信通知集成等实战指南,帮助团队构建统一的企业级SQL审计平台,提升数据库操作规范与安全。 阅读详情

相关推荐

LCD驱动芯片——BL55072A驱动程序

初始化子程序: START 0x7C; I2C子地址 0xEA;ICSET,软件复位芯片 0xC0;MODSET,关显示 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8;ICSET,清复位bit1 STOP 显示刷新子程序: START 0x7C;I2C子地址 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8或0xEC;ICSE

love421的博客 3175

基于C#的接口基础教程[3]

第三节 定义接口成员  接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。接口定义创建新的定义空间,并且接口定义直 接包含的接口成员定义将新成员引入该定义空间。  说明:  1、接口的成员是从基接口继承的成员和由接口本身定义的成员。  2、接口定义可以定义零个或多个成员。接口的成员必须是方法、属性、事件或

Mark 's BLOG 1060

手把手教你用Cadence Virtuoso设计折叠式共源共栅放大器(0.18μm工艺实战)

本文详细介绍了在0.18μm工艺下使用Cadence Virtuoso设计折叠式共源共栅放大器的完整流程。从工艺参数获取、电路架构分析到具体参数计算和仿真验证,提供了实战设计指南,帮助工程师掌握这一模拟IC设计中的关键技术,特别适合需要中等增益和较大输出摆幅的应用场景。

open4的博客 410

接口的定义和接口的成员

Java中的接口:多个抽象类的抽象就是接口在Java中最小的程序单元就是类,接口其实是一个特殊的类Java中的接口表示规范,用于定义一组抽象方法,表示某一类食物必须具备的功能,要求实现类必须来实现该接口并提供方法实现---------------------------------接口存在的成员: 1):接口中没有构造器 推论:接口不能创建对象(不能new),接口中不能定义普通方法 2):接口中定...

孤獨的鬥士的博客 4687

ADS 2024 Circuit Envelope 仿真:3步配置调制源,分析5G NR EVM与ACPR

本文详细介绍了ADS 2024 Circuit Envelope仿真技术在5G NR调制源配置与关键指标分析中的应用。通过3步配置调制源,工程师可以高效评估EVM与ACPR等关键指标,特别适用于功放设计中的非线性效应诊断。文章还提供了优化仿真设置和精确提取EVM、ACPR的实用方法,助力5G射频前端设计。

weixin_28559803的博客 385

农作物生长模型:数学建模与实战案例

在本篇博客中,我们介绍了农作物生长模型的基本原理,并结合Matlab代码和实战案例,演示了如何应用数学建模技术进行农作物生长模型的研究与应用。农作物生长模型在农业领域具有重要意义,希望本篇博客能帮助读者更好地理解农作物生长模型的原理和应用,并在实际农业生产中取得更好的效果。

YOLO 2734

Java接口成员的特点和接口的各种关系

类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个 接口(多个接口中有重名的方法,只要重写一次就可以了,重写一次表示两个 类里边的方法都被重写了)接口和接口的关系:继承关系,可以单继承也可以多继承(细节:如果实现类实现了最下面的子 接口,那么就需要重写所有的抽象方法)

TNTxd的博客 584

【QNX Hypervisor 2.2 用户手册】2.6 处理qvm终止

你可以注册通知,以在qvm进程实例退出时得到通知。这样你就可以采取相应的措施来响应这种终止事件。

从0到1,突破自己 1106

Java接口的定义、使用及成员特点

Java接口的定义和使用、接口中可以有哪些成员、接口与类之间如何交互

qq_23935145的博客 692

华为OD机试 - TLV格式(Python/JS/C/C++ 2025 C卷 100分)

两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成。第二行:需要匹配的tag数量n(0 < n < 1000)后面N行:需要匹配n个tag值(十进制表示),递增排列。标签10(0A)存在,长度3,valueOffset=2。标签15(0F)长度4,valueOffset=2。标签14(0E)长度2,valueOffset=8。

学Java,找哪吒 2041

YOLO11 Backbone改进:二值化、三值化权重实战(一)

本文介绍了二值化/三值化神经网络的基本概念、优势挑战及应用场景。二值化网络将权重限制为±1,三值化则增加0值,显著减少模型存储需求和计算复杂度。虽然存在精度下降等挑战,但通过技术改进已能在移动设备、自动驾驶等领域应用。文章分析了YOLO11中适合量化的层,并详细阐述了二值化权重原理及Straight-Through Estimator等关键技术。二值化/三值化神经网络为资源受限设备提供了高效的深度学习解决方案。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 298

显示接口成员实现(explicit interface member implementation)总结

为了实现接口,类或结构可以声明显示接口成员实现(explicit interface member implementation),显示节后成员实现就是一种方法、属性、事件或索引器声明,它实用完全限定接口成员作为标识符。接口成员有时也用它的完全限定名(fully qualified name)来引用。成员的完全限定名将引用声明该成员的接口。接口成员限定名的组成是:声明该成员的接口名字.该成

zenolee的专栏 1082

Spring Framework 7.002.Spring IoC 容器与 Bean 简介(Introduction to the Spring IoC Container and Beans)

摘要:Spring框架的核心技术包括IoC容器和AOP技术。IoC容器通过依赖注入实现控制反转,提供Bean管理和配置功能。ApplicationContext作为BeanFactory的扩展,增加了企业级特性。文档详细介绍了容器配置、Bean定义、依赖注入、作用域等核心概念,以及基于注解的配置方式。AOP框架支持80%的AOP需求,并可集成AspectJ。此外还涵盖环境抽象、容器扩展点等高级特性,为Java企业应用开发提供全面支持。(150字)

无 213

接口成员显示实现

(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。在前面的文章中,我们已经对C#接口的概念,如何定义接口以及如何对接口进行访问等问题进行了详细的讨论。在这些知识的基础上,本文我们将来了解实现接口的方法。   显式实现接口成员 为了实现接口,类可以定义显式接口成员执行体(Explicit interface member impleme

挨踢生涯 1061

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

显示实现接口成员

using System; using System.Collections.Generic; using System.Linq; using System.Text; #region /*试想一下,如果在一个类A继承自接口B和C, 并且在B和C中包含具有相同签名的成员, 那么在类中实现该成员将导致两个接口都使用该成员作为他们的实现, 然而,如果两个接口成员实现不同的功能, 那么将会导致一个接口...

weixin_30919235的博客 247

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C#隐式实现接口成员与显示实现接口成员

对C#隐式实现接口成员与显示实现接口成员的简单说明

酒红的专栏 3083

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

(原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员

10.3 接口的实现   在继续前,先讨论一下如何定义和实现接口。第9章介绍了接口定义的方式与类相似,使用的代码如下: interface IMyInterface { // Interface members. }   接口成员的定义与类成员的定义相似,但有几个重要的区别:      不允许使用访问修饰符(public、private、protected或inte...

weixin_30652897的博客 430

C#接口显示成员用法

using System; namespace 接口__显示成员 { class Program { /* 背景:2个接口,具有相同标签成员。会导致2个接口都使用该成员作为它们实现。 显示接口:使用接口名称和一句点命名该类成员来实现 */ static void Main(string[] args) { Myclass myclass = new Myclass()

Linlietao0587的博客 276

C# 接口,显示实现接口

接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。 类中的成员默认的访问修饰符是private ,而接口中默认的访问修饰符是public(默认为public)。 接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。 显示实现接口的目的:解决方法的重名问题 什么时候显示的去实现接口: 当继承的接口中的方法和参数一摸一样的时候,要是

houyanhua1的专栏 1835

泛型中使用接口的显示实现

    有同事问起一个问题:    己写一个模板容器,需要实现IEnumerable的接口,由于IEnumerable派生于IEnumerable,所以要实现两个方法,一个是模板的IEnumerator GetEnumerator ()另一个是普通的IEnumerator      GetEnumerator ()     C#的函数重载不允许只有返回值不同的重载,所以这两个东西不能同时存在,咋拌

石头记 1750

C# 中 显示实现接口 与 隐式实现接口

当类实现一个接口时,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性。当类实现多个接口时,并且接口中包含相同的方法签名,此时使用显式接口实现。即使没有相同的方法签名,仍推荐使用显式接口,因为可以标识出哪个方法属于哪个接口。隐式接口实现,类和接口都可访问接口中方法。显式接口实现,只能通过接口访问。 1、显示实现接口后,

发展是曲折的但也是前进的 1131

接口

什么是接口 接口是指定一组函数成员而不实现他们的引用类型。 所以只能类和结构实现接口。 例:用接口使PrintInfo方法能够用于多个类 interface IInfo { string GetName(); string GetAge(); } class CA : IInfo { public string Name; public int Age; p...

Mr.Sun 的博客 302

c# 学习笔记 显示实现接口

隐式地实现接口成员,可以通过类和接口来访问该成员。 显示地实现接口成员,只能通过接口来访问该成员。 隐式实现接口实例: public interface ImyInterface { void DoSomething(); void DoSomethingElse(); } public class MyBaseClass : ImyInterface { public void D

gbasp2008的专栏 392

接口的实现

接口的实现案例interface IControl    {        void Paint();    }    interface IDataBind    {        void Bing(int d);    }    public class Control:IControl    {        public void Paint()        {;}    

学无止境的专栏 519

c#中接口的使用方法图解_C#中接口的使用(一)

从技术上讲,接口是一组包含了函数型方法的数据结构,通过这组数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。声明接口声明实际上就是一种定义新的接口的类型声明,声明的格式如下:attributes interface-modifiers interface identifier interfacebase interface-body接口仅可使用下列修饰符:new、public p...

weixin_35202013的博客 578

C#中关于接口(Interface)的详解(附带案例)

接口是什么? 接口该怎么去声明? 接口成员是什么? 接口成员包括什么? 接口成员如何去进行声明? 接口有什么特点? 接口如何去实现呢? 接口实现的两种方式? 接口被使用的目的或者作用是什么?

凭时间赢来的东西,时间肯定会为之作证 14万+
上一篇: 数据库保护
下一篇: 对接口成员的访问
NETZHOU
博客等级 码龄24年 10粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值