安全接口 interface --显示实现接口

前言:
当我们定义接口的成员的时候不需要写访问控制符,因为它是默认public的,也只能是public。当一个类要实现这个接口的时候,自然要公开其成员。一直以来我都这么做。

interface Interface1
    {
        string GetName(string name);
    }
class Class1:Interface1
    {
        public string GetName(string name)
        {
            return name;
        }
    }
}

然而这么做并没有错。直到我学习控件开发的时候,发现了原来接口可以这么来实现。

public class DropDownList : ListControl, IPostBackDataHandler
    {

        protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            return false;
        }

        protected virtual void RaisePostDataChangedEvent()
        {
        }

        bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            return this.LoadPostData(postDataKey, postCollection);
        }

        void IPostBackDataHandler.RaisePostDataChangedEvent()
        {
            this.RaisePostDataChangedEvent();
        }
    }

LoadPostData和RaisePostData方法是Page调用的,但却没有公开这两个方法。调用的时候不能用类的实例来调用,只能用接口的引用来调用,从而实现实现接口的实例只能被接口的引用调用的目的。

从此我就想到安全接口这个名称(不知道合理否),在编程中,我亦可以这么使用。

class Class1:Interface1
    {
        private string GetName(string name)
        {
            return name;
        }
        string Interface1.GetName(string name)
        {
            name += " interface";
            return GetName(name);
        }

    }
class Program
    {
        static void Main(string[] args)
        {
            Class1 c = new Class1();
            Interface1 i = (Interface1)c;
            System.Console.WriteLine(i.GetName("Eric Wen"));
        }
    }

我觉得这样更符合oo,接口的方法不会泛用,实现和调用都和清晰。

后续:
看了回复后知道这种情况就是显示实现接口(Explicit interface member implementations)。
显示实现接口说明:
    1、不能在方法调用、属性访问以及索引指示器访问中通过全权名访问显式接口成员执行体。事实上,显式接口成员执行体只能通过接口的实例,仅仅引用接口的成员名称来访问。 
    2、显式接口成员执行体不能使用任何访问限制符,也不能加上abstract, virtual, override或static 修饰符。
    3、显式接口成员执行体和其他成员有着不同的访问方式。因为不能在方法调用、属性访问以及索引指示器访问中通过全权名访问,显式接口成员执行体在某种意义上是私有的。但它们又可以通过接口的实例访问,也具有一定的公有性质。
4、只有类在定义时,把接口名写在了基类列表中,而且类中定义的全权名、类型和返回类型都与显式接口成员执行体完全一致时,显式接口成员执行体才是有效的
    5、如果一个类中既显示又隐式的实现了接口,这是显示元素只能通过接口的引用来直接访问,隐式元素只可以通过类来直接访问。

为什么要显示实现接口呢,目的:
    1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
    2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。

本文转载:http://www.cnblogs.com/ericwen/archive/2007/12/28/1018181.html

时间: 2024-10-31 09:28:23

安全接口 interface --显示实现接口的相关文章

Java简明教程 09. 抽象类(abstract class)和接口(interface)

抽象类(abstract class) 描述抽象的事物,  比如人类(human), 就是一个抽象类. 对于人类这个抽象类, 具体的就是某一个人, 比如张三(男)啊, 小红(女)啊,虽然说人都会eat, 可是男人和女人的eat似乎又是不一样的.男人一般都是大口大口的吃, 而女人比较慢条斯理. AbstractDemo.java 1 abstract class Human { //抽象类, 特点: 1. 前面有abstract修饰 2 // 2. 无法直接生成一个对象,需要子类去继承这个类, 并

类的继承 接口interface/implements

 继承: 关键字:extends,使一个类继承并拥有另一个已经存在类的成员属性和方法,被继承的类称为父类或基类,继承类为子类: public:       方法或者属性在任何作用域下都可以访问到,而且是默认的,如果没有为一个属性或方法指定访问修饰符,它将是public.protected:本类和子类可以访问,外部对象不可以调用.private:      只能在本类访问,子类与外部对象都不可能调用.经过private标记的方法或者属性可以在继承类中重新定义,每一个类只能看到它自己定义      

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

显示实现接口

接口定义了一系列的行为规范,为类型定义一种Can-Do的功能.例如,实现IEnumerable接口定义了GetEnumerator方法,用于获取一个枚举数,该枚举数支持在集合上进行迭代,也就是我们常说的foreach.接口只是定义行为,具体的实现需要由具体类型负责,实现接口的方法又分为隐式实现与显示实现. 一.隐式/显示实现接口方法 简单的说,我们平时“默认”使用的都是隐式的实现方式.例如: interface ILog { void Log(); } public class FileLogg

C# 使用隐式或显示实现接口的区别

通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下:      interface IAnimal { void Dog(); } class Animal:IAnimal { public void Dog() { Console.WriteLine("dog..."); } } 定义了一个IAnimal接口,一般我们都会这么调用: //通过类调用 Animal anima

显示接口和隐式接口的区别:

一.新建一个接口类 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// InterF 的摘要说明 /// </summary> public class InterF { public interface hide { string show(); } public interface display { string show(

好程序员训练营-Java接口(interface)的概念及使用

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 接口使用 interface 关键字来声明,可以看做是一种特殊的抽象类,可以指定一个类必须做什么,而不

浅谈php 抽象类abstract和接口interface

一.抽象类(abstract) 抽象类定义的规范 1.php5支持抽象类和抽象方法 2.定义得抽象类无法被实例化 3.任何一个类里面声明了抽象方法,那么这个类必须声明为抽象类 4.被定义得抽象方法只能声明其调用方式(参数),不能定义其具体得功能实现 5.继续抽象类的子类必须定义父类(抽象类)所有的抽象方法,并且访问控制(public.protected)必须一致,或者更为宽松 如:父类protected,子类可以protected.public.父类是public,那么子类就只能是public,

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有