abstract(抽象)类和interface(接口)是面向对象编程中两个概念,但是学了很多年编程的程序员有时对这两个概念的区分仍然不是很清楚。下面就讲解abstract类和interface的概念和区别。
abstract(抽象)类
抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法。
抽象类不能被实例化。
抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类。
具体派生类必须覆盖基类的抽象方法。
抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。
下面的代码讲解了abstract(抽象)类的使用方法。
using System;
public abstract class A //抽象类A
{
private int num = 0;
public int Num //抽象类包含属性
{
get
{
return num;
}
set
{
num = value;
}
}
public virtual int getNum() //抽象类包含虚方法
{
return num;
}
public void setNum(int n) // //抽象类包含普通方法
{
this.num = n;
}
public abstract void E(); //类A中的抽象方法E
}
public abstract class B : A //由于类B继承了类A中的抽象方法E,所以类B也变成了抽象类
{
}
public class C : B
{
public override void E() //重写从类A继承的抽象方法。如果类B自己还定义了抽象方法,也必须重写
{
//throw new Exception("The method or operation is not implemented.");
}
}
public class Test
{
static void Main()
{
C c = new C();
c.E();
}
}
interface(接口)
接口不能被实例化。
接口只能包含方法声明。
接口的成员包括方法、属性、索引器、事件。
接口中的所有成员默认为public,因此接口中不能有private修饰符。
派生类必须实现接口的所有成员。
一个类可以直接实现多个接口,接口之间用逗号隔开。
一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员。
接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。
下面的代码讲解了interface(接口)的使用方法。
public delegate void EventHandler(ob ject sender, Event e);
public interface ITest
{
//int x = 0;
int A
{
get;
set;
}
void
event EventHandler Event;
int this[int index]
{
get;
set;
}
}
抽象类和接口的相同点和区别
相同点
都可以被继承
都不能被实例化
都可以包含方法声明
派生类必须实现未实现的方法
区别
抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
新闻热点
疑难解答