接口类与抽象函数类的区别

来源:互联网 发布:仿真实验室软件 编辑:程序博客网 时间:2024/05/16 19:33

今天刚看到这,感觉有点糊涂,收集众家所言汇总于此,以备忘


1.virtual:允许被重写,但不强制要求。声明时提供其自身实现;
2.abstract:强制要求其继承者重写。声明时不提供其自身的实现,抽象类不能被实例化;
3.interface:接口就是协议,其声明的成员(属性,方法,事件和索引器)必须由其继承的类实现。接口不能直接被实例化。

虚方法与抽象方法的区别在于,虚方法提供自身的实现,并且强制要求子类重写;而抽象方法不提供自身的实现,并且强制子类重写。

抽象类与接口很相似,但是思路不一样。接口是公开类的成员,而抽象类则是抽象类成员以要求子类继承并实现。


1. 抽象类和接口的比较

抽象类

接口

1

使用abstract关键字来定义抽象类。

使用interface关键字来定义接口。

2

在抽象类中可以定义抽象方法,也可以定义非抽象方法。

在接口中只能定义默认的抽象方法,不能定义非抽象的方法。接口实际上是一个纯抽象类。

3

在抽象类中定义的抽象方法,没有方法体。

在接口中定义的方法,没有方法体。

4

在抽象类中能定义常量、变量、静态方法和构造函数。

在接口中只能定义静态常量和实例方法,不能定义实例常量、静态变量、实例变量、静态方法和构造函数。

5

抽象类本身不提供它所定义的抽象方法的实现。

抽象类能被继承,由它的子类来实现在抽象类中定义的所有抽象方法。

接口本身不提供它所定义的方法的实现。

接口能被实现,由它的实现类来实现在接口中定义的所有方法。

6

在子类中必须覆盖它的抽象类定义的所有抽象方法。

在实现类中必须实现它的接口定义的所有方法。

7

抽象类可以从另一个抽象类继承。

接口可以从另一个接口继承。

8

当一个抽象类继承于另一个抽象类时,可以不用实现在基类(抽象类)中定义的抽象方法。

当一个接口继承于另一个接口时,不用也不能实现它的父接口中定义的方法,因为在接口中定义的方法是隐式的抽象方法,是没有方法体的。

9

抽象类不能实例化。

接口不能实例化。

10

定义抽象类时不能使用final关键字。

定义接口时不能使用final关键字。

11

一个类只能继承一个抽象类。

一个类可以实现多个接口。

 

 

(1) 抽象类主要用作基类,共享某些公共的成员和行为。

(2) 接口主要用于类,在接口中定义这些类都具有的功能。

(3) 好的接口定义应该具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只需要实现接口中的一个功能,而不得不去实现接口中的其它方法,这就叫接口污染。

(4) 抽象类主要用于一系列关系密切的对象;而接口适合为不相关的类提供通用功能。

(5) 示例1

飞机会飞,鸟会飞,F22战斗机属于飞机(抽象类),鸽子属于(抽象类),但它们都实现了同一个接口“飞”。

(6) 示例2

就像铁门和木门都是(抽象类),你想要门,我给不了(抽象类不能实例化),但我可以给你个具体的铁门或木门(多态性);而且只能是门,你不能说它是窗(单继承);一个门可以有(接口),也可以有门铃(另一个接口,多实现)。门(抽象类)定义了是什么,锁(接口)规定了能做什么,一个接口最好只能做一件事,你不能要求锁也发出声音(接口污染)

1. 抽象类和接口的比较

抽象类

接口

1

使用abstract关键字来定义抽象类。

使用interface关键字来定义接口。

2

在抽象类中可以定义抽象方法,也可以定义非抽象方法。

在接口中只能定义默认的抽象方法,不能定义非抽象的方法。接口实际上是一个纯抽象类。

3

在抽象类中定义的抽象方法,没有方法体。

在接口中定义的方法,没有方法体。

4

在抽象类中能定义常量、变量、静态方法和构造函数。

在接口中只能定义静态常量和实例方法,不能定义实例常量、静态变量、实例变量、静态方法和构造函数。

5

抽象类本身不提供它所定义的抽象方法的实现。

抽象类能被继承,由它的子类来实现在抽象类中定义的所有抽象方法。

接口本身不提供它所定义的方法的实现。

接口能被实现,由它的实现类来实现在接口中定义的所有方法。

6

在子类中必须覆盖它的抽象类定义的所有抽象方法。

在实现类中必须实现它的接口定义的所有方法。

7

抽象类可以从另一个抽象类继承。

接口可以从另一个接口继承。

8

当一个抽象类继承于另一个抽象类时,可以不用实现在基类(抽象类)中定义的抽象方法。

当一个接口继承于另一个接口时,不用也不能实现它的父接口中定义的方法,因为在接口中定义的方法是隐式的抽象方法,是没有方法体的。

9

抽象类不能实例化。

接口不能实例化。

10

定义抽象类时不能使用final关键字。

定义接口时不能使用final关键字。

11

一个类只能继承一个抽象类。

一个类可以实现多个接口。

 

 

(1) 抽象类主要用作基类,共享某些公共的成员和行为。

(2) 接口主要用于类,在接口中定义这些类都具有的功能。

(3) 好的接口定义应该具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只需要实现接口中的一个功能,而不得不去实现接口中的其它方法,这就叫接口污染。

(4) 抽象类主要用于一系列关系密切的对象;而接口适合为不相关的类提供通用功能。

(5) 示例1

飞机会飞,鸟会飞,F22战斗机属于飞机(抽象类),鸽子属于(抽象类),但它们都实现了同一个接口“飞”。

(6) 示例2

就像铁门和木门都是(抽象类),你想要门,我给不了(抽象类不能实例化),但我可以给你个具体的铁门或木门(多态性);而且只能是门,你不能说它是窗(单继承);一个门可以有(接口),也可以有门铃(另一个接口,多实现)。门(抽象类)定义了是什么,锁(接口)规定了能做什么,一个接口最好只能做一件事,你不能要求锁也发出声音(接口污染)

1. 抽象类和接口的比较

抽象类

接口

1

使用abstract关键字来定义抽象类。

使用interface关键字来定义接口。

2

在抽象类中可以定义抽象方法,也可以定义非抽象方法。

在接口中只能定义默认的抽象方法,不能定义非抽象的方法。接口实际上是一个纯抽象类。

3

在抽象类中定义的抽象方法,没有方法体。

在接口中定义的方法,没有方法体。

4

在抽象类中能定义常量、变量、静态方法和构造函数。

在接口中只能定义静态常量和实例方法,不能定义实例常量、静态变量、实例变量、静态方法和构造函数。

5

抽象类本身不提供它所定义的抽象方法的实现。

抽象类能被继承,由它的子类来实现在抽象类中定义的所有抽象方法。

接口本身不提供它所定义的方法的实现。

接口能被实现,由它的实现类来实现在接口中定义的所有方法。

6

在子类中必须覆盖它的抽象类定义的所有抽象方法。

在实现类中必须实现它的接口定义的所有方法。

7

抽象类可以从另一个抽象类继承。

接口可以从另一个接口继承。

8

当一个抽象类继承于另一个抽象类时,可以不用实现在基类(抽象类)中定义的抽象方法。

当一个接口继承于另一个接口时,不用也不能实现它的父接口中定义的方法,因为在接口中定义的方法是隐式的抽象方法,是没有方法体的。

9

抽象类不能实例化。

接口不能实例化。

10

定义抽象类时不能使用final关键字。

定义接口时不能使用final关键字。

11

一个类只能继承一个抽象类。

一个类可以实现多个接口。

 

 

(1) 抽象类主要用作基类,共享某些公共的成员和行为。

(2) 接口主要用于类,在接口中定义这些类都具有的功能。

(3) 好的接口定义应该具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只需要实现接口中的一个功能,而不得不去实现接口中的其它方法,这就叫接口污染。

(4) 抽象类主要用于一系列关系密切的对象;而接口适合为不相关的类提供通用功能。

(5) 示例1

飞机会飞,鸟会飞,F22战斗机属于飞机(抽象类),鸽子属于(抽象类),但它们都实现了同一个接口“飞”。

(6) 示例2

就像铁门和木门都是(抽象类),你想要门,我给不了(抽象类不能实例化),但我可以给你个具体的铁门或木门(多态性);而且只能是门,你不能说它是窗(单继承);一个门可以有(接口),也可以有门铃(另一个接口,多实现)。门(抽象类)定义了是什么,锁(接口)规定了能做什么,一个接口最好只能做一件事,你不能要求锁也发出声音(接口污染)

原创粉丝点击