• 接口


    一、多态性

      除了使用继承使用多态性,还能通过接口使用它。与抽象类不一样的是,接口不包含任何实现。

    二、接口的实现

      1.显示

        使用显示的方法实现接口,只能通过接口本身调用它,所以,最典型的做法是将对象转型为接口。

    internal interface IPerson
        {
            string FullName { get; }
        }
    
        public class Contact : IPerson
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
    
            string IPerson.FullName
            {
                get { return FirstName + " " + LastName; }
            }
        }
    View Code
    Contact contact = new Contact();
                contact.FirstName = "FirstName";
                contact.LastName = "LastName";
    
                //Contact 不包含FullName的定义
                Console.WriteLine(contact.FullName);
    
                Console.WriteLine(((IPerson) contact).FullName);
    View Code

      2.隐式

        上面代码中FullName前面不加IPerson则为隐式实现。要隐式实现一个成员,只要类成员的签名和接口成员的前面相符即可。

        由于成员是像类其他成员一样声明,所以可以在代码中直接调用隐式实现的成员。 Console.WriteLine(contact.FullName); 就不会报错。

        

        隐式实现必须是public,显示实现是不允许加修饰符的。此外,在隐式实现中virtual是可选的(如果派生类可以重写实现就加上,反之,不加上),override是不允许的(由于成员的接口不包含实现,所以override没有意义)。

      3.显示实现接口与隐式实现接口比较

        区别主要在于从实现接口类外部分可访问性

        一下是基本的设计原则,帮助你选择是显示还是隐式实现:

        1.成员是不是类核心的功能?

          如果不是就显示实现,反之,隐式实现。

        2.接口成员名作为类成员是否恰当?

          简单说就是接口方法前面在实现类中是否会引起歧义,如果会则显示实现,不会则可以隐式实现。

        3.是否已有一个同名的类成员?

          有就显示实现,没有则可以隐式实现。

    三、接口继承

      一个接口可以从另一个接口派生,派生的接口将继承“基接口”的所有成员。

    interface IBase
        {
            void Get();
        }
    
        internal interface IBaseExpand : IBase
        {
            void GetByName(string name);
        }
    
    
        public class ServiceClass : IBaseExpand
        {
            public void Get()
            {
            }
    
            public void GetByName(string name)
            {
                
            }
        }
    View Code

    这里有意思的是,如果Get()是显示实现的话,那么必须使用IBase.Get()

      多接口继承

      接口上的扩展方法

      通过接口实现多重继承

    四、版本控制

      如果我们的组件是给其他人用的话,在创建一个新版本时,不应改动接口。

      一般是新建一个继承原有接口的新接口。

    五、接口和类比较

      接口引入了另一个类别的数据类型。是少数不对基类System.Object进行扩展的类型之一(还有指针类型和类型参数类型)。

    抽象类 接口

    1.不能脱离它的派生类来实例化,构造器只能由它的派生类调用。

    2.定义了基类必须实现的抽象成员签名。

    3.扩展性比接口好,不会破坏任何版本兼容性。

    4.可以包含存储在字段的数据。

    5.允许包含实现的(virtual)成员,所以能为派生类提供一个默认的实现。

    6.从一个抽象类派生,会用掉类唯一的一个基类型选项(单一继承)

    1.不能实例化。

    2.接口所有成员必须在基类中实现。

    3.会破坏版本兼容性。

    4.不能存储任何数据。只能在派生类中指定字段(解决这个问题的方法是定义属性,但不能包括实现)。

    5.所有成员自动成为virtual成员,但不包括任何实现。

    6.虽然不允许存在默认实现,但实现接口的类可以继续相互派生。

  • 相关阅读:
    CJB的大作
    OI省选算法汇总
    bzoj1078【SCOI2008】斜堆
    zrt中文题
    bzoj4726【POI2017】Sabota?
    bzoj4591 【Shoi2015】超能粒子炮·改
    bzoj2086【Poi2010】Blocks
    bzoj2091【Poi2010】The Minima Game
    bzoj2038小z的袜子
    bzoj4282慎二的随机数列
  • 原文地址:https://www.cnblogs.com/zhangxiaohui/p/4164873.html
Copyright © 2020-2023  润新知