C#中抽象类和接口的区别2


        1.接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
        抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;

       2. 下面分别从声明,成员,实现几个角度来比较
        一、关于声明:
       【接口】的修饰符:new public private protected internal  如
       public[public private protected internal] interface IInterface{   //interface body }
       new 修饰符仅允许在类中定义的接口中使用。它指定接口有意隐藏同名的继承成员。
      备注:类成员声明中可以使用与一个被继承的成员相同的名称或签名来声明一个成员。发生这种情况时,就称该派生类成员隐藏了基类成员。隐藏一个继承的成员不算是错误,但这确实会导致编译器发出警告。若要取消此警告,派生类成员的声明中可以包含一个 new 修饰符,表示派生成员是有意隐藏基成员的。
       【接口】的基接口:接口可以从零个或多个接口继承, 接口不能从自身直接或间接继承,否则会发生编译时错误。接口也不能继承自类,如果可以的话那将违反了C#类不能多重继承的原则。
       【接口】的接口体:很简单  用{   //接口成员是可选的  }表示    
       
       【抽象类】  关于声明,自己想想吧,除了加了个限定的abstract修饰符似乎没有太多可以描述的地方,抽象类本身也是是个类啊,除了不能被实例外。
public abstract AbstractClass{
   //class body
}
       【抽象类】的基类最多一个类,但却可以有n个接口

         二、关于成员
       【接口】的成员只能是签名,没有实现,能包括的成员是:方法,属性,索引器,事件,举例如下
           Public interface IInterface
          {
               Void Method();//显然只是个方法说明,没有方法体。
               String Name{set;get};//显然其用途是指示属性是读写、只读还是只写。
               String this[int index]{get:set;} //显然其用途是指示索引器是读写、只读还是只写。
                              event EventHandler Even ;
          }
                    public delegate void EventHandler(object sender, Event e) ; 
          接口所有的成员都不能加访问修饰符,因为既然是接口,那么所有的成员都是可以访问的。

        【抽象类】的成员应该有什么,想想类吧,类有什么,它也应该什么。
         特别说明的是,抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类。
         抽象方法,同接口一下,也只有方法体,没有实现。
          三、关于实现
        【抽象类】和【接口】都不能直接实例化

原文地址:https://www.cnblogs.com/Mryang-blog-cn/p/method3.html