关于接口与抽象类

小结:

1. 接口

只有方法名,没有方法体,由继承自它的类提供所有方法的实现,C#中规定类只能单继承,但可以通过接口来实现多继承,即一个类可以继承多个不同的接口

2. 定义一个接口

a. 不能定义构造函数

b. 不能定义实例成员

c. 不能定义静态成员

3. 调用接口方法

如:public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>

String继承了多个接口,拿ICloneable为例, 代码如下:

String ss = "chine";
ICloneable cloneable = ss;

----cloneable变量只能访问ICloneable中定义的方法以及ICloneable从继承链上端继承下来的方法【Object中的方法】,cloneable变量不能访问String类型中的任何方法

4. 值类型与接口

像引用类型一样,值类型也可以实现0个或多个接口,然而,当转换值类型为接口类型时会发生装箱操作,会产生性能损耗。

5. 显式接口实现(EIMI: explicit interface method implementation)

    public interface ITouch
    {
        void Too();
    }
    public class Dosome : ITouch
    {
        public void Too()
        {
            Console.WriteLine("public Too");
        }
        void ITouch.Too()//显式接口实现,前面不能加任何访问修饰符(如:public,private等)
        {
            Console.WriteLine("ITouch Too");
        }
    }

----调用:
            Dosome dosmoe = new Dosome();
            dosmoe.Too();//输出:public Too

            ITouch itouch = dosmoe;
            itouch.Too();//输出:ITouch Too

----显式接口实现只能通过该接口类型变量才能访问,该接口的实现类的实例变量不能访问它
----应尽量少使用EIMI

 6. 接口与抽象类的异同

 a. 相同点

     都不能直接实例化,都是通过继承类来实现其抽象方法。

 b. 不同点

     接口支持多继承;抽象类不支持多继承

     接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法

7. 什么时候用接口,什么时候用抽象类【规则与场合】

    a. 抽象类应主要用于关系密切的对象,而接口适合为不相关的类提供通用功能。

    b. 接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系。

    c. 如果预计会出现版本问题,可以创建"抽象类"。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现其他种类动物的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。

    d. 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。

    e. 对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化,只能通过继承类来实现【若密封的话,就不能创建子类了】。

    f. 在抽象方法声明中不能使用 static 或 virtual 修饰符。

    g. 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。

   

原文地址:https://www.cnblogs.com/notebook2011/p/2935847.html