zoukankan      html  css  js  c++  java
  • (原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员

    10.3  接口的实现

      在继续前,先讨论一下如何定义和实现接口。第9章介绍了接口定义的方式与类相似,使用的代码如下:

    interface IMyInterface {
        // Interface members.
    }

      接口成员的定义与类成员的定义相似,但有几个重要的区别:

         不允许使用访问修饰符(public、private、protected或internal),所有的接口成员都是公共的。 

            接口成员不能包含代码体。

          接口不能定义字段成员。

        接口成员不能用关键字static、virtual、abstract或sealed来定义。

        类型定义成员是禁止的。

      但要隐藏继承了基接口的成员,可以用关键字new来定义它们,例如:

    interface IMyBaseInterface {
        void DoSomething();
    }
    
    interface IMyDerivedInterface : IMyBaseInterface {
        new void DoSomething();
    }

      其执行方式与隐藏继承的类成员的方式一样。

      在接口中定义的属性可以定义访问块 get 和 set 中的哪一个能用于该属性(或将它们同时用于该属性),例如:

    interface IMyInterface {
        int MyInt( get; set; )
    }

      其中int属性MyInt有get和set存取器。对于访问级别有更严限制的属性来说,可以省略它们中的任一个。

      note : 这个语法类似于自动属性,但自动属性是为类(而不是接口)定义的,自动属性必须包含get和set存取器。

      接口没有指定应如何存储属性数据。接口不能指定字段,例如用于存储属性数据的字段。最后,接口与类一样,可以定义为类的成员(但不能定义为其他接口的成员,因为接口不能包含类型定义)。

    在类中实现接口

      现接口的类必须包含该接口所有成员的实现代码,且必须匹配指定的签名(包括匹配指定的get和set块),并且必须是公共的。例如:

    public interface IMyInterface {
        void DoSomething();
        void DoSomethingElse();
    }
    
    public class MyClass : IMyInterface {
        public void DoSomething() {
            
        }
        
        public void DoSomethingElse() {
            
        }
    }

      可以使用关键字 virtual 或 abstract 来实现接口成员,但不能使用 static 或 const。还可以在基类上实现接口成员,例如:

    public interface IMyInterface {
        void DoSomething();
        void DoSomethingElse();
    }
    
    public class MyBaseClass {  // 注意这里的基类并没有继承接口
        public void DoSomething() {
            
        }
    }
    
    public class MyDerivedClass : MyBaseClass, IMyInterface {
        // DoSometing()接口在基类中实现
        
        public void DoSomethingElse() {
            
        }
    }

      继承一个实现给定接口的基类,就意味着派生类隐式地支持这个接口,例如:

    public interface IMyInterface {
        void DoSomething();
        void DoSomethingElse();
    }
    
    public class MyBaseClass : IMyInterface {
        public virtual void DoSomething() {
            
        }
        
        public virtual void DoSomethingElse() {
            
        }
    }
    
    public class MyDerivedClass : MyBaseClass {
        public override void DoSomething() {
            
        }
    }

      显然,在基类中把实现代码定义为虚拟,派生类就可以替换该实现代码,而不是隐藏它们。如果要使用new关键字隐藏一个基类成员,而不是重写它,则方法IMyInterface.DoSomething()就总是引用基类版本,即使通过这个接口来访问派生类,也是这样

    1. 显示实现接口成员

      也可以由类显式地实现接口成员。如果这么做,该成员就只能通过接口来访问,不能通过类来访问。上一节的代码中使用的隐式成员可以通过类和接口来访问

      例如,如果类MyClass隐式地实现接口IMyInterface的方法DoSomething(),如上所述,则下面的代码就是有效的:

    MyClass myObj = new MyClass();
    myObj.DoSomething();

      下面的代码也是有效的:

    MyClass myObj = new MyClass();
    IMyInterface myInt = myObj;
    myInt.DoSomething();

      另外,如果MyDerivedClass显式实现DoSomething(),就只能使用后一种技术(只能用接口访问)。其代码如下:

    public class MyClass : IMyInterface {
        void IMyInterface.DoSomething() {  // 显示实现
            
        }
        
        public void DoSomethingElse() {
            
        }
    }

      其中 DoSomething()是显式实现的,而 DoSomethingElse()是隐式实现的。只有后者可以直接通过MyClass的对象实例来访问。

  • 相关阅读:
    如何使用Flexbox和CSS Grid,实现高效布局
    最常用的四种大数据分析方法
    如何编写更好的SQL查询:终极指南-第三部分
    如何编写更好的SQL查询:终极指南-第二部分
    如何编写更好的SQL查询:终极指南-第一部分
    ES2017异步函数现已正式可用
    相对传统桌面设计器,在线报表设计器价值何在?
    如何实现报表设计中的高精度报表套打?
    2017年前端开发工具趋势
    Angular2 VS Angular4 深度对比:特性、性能
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4961494.html
Copyright © 2011-2022 走看看