原文地址为:(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)

Abstract
這兩個的確非常的像,主要都是為了實踐『多型』,但實際的用途並不一樣。

Introduction
interface和abstract class在語言層次的差異,我就不再贅述,本文主要是放在何時該使用interface?何時該使用abstract class?

interface用在當一個物件須和其他物件共同合作時,為了確保其他物件有我想要的method,所以定下interface要該物件遵守,在Design Pattern到處可以看到這種應用,如strategy,bridge,prototype...。

而abstract class是用在整個繼承體系的最上層,用來定義出整個繼承體系該有哪些method,子類別可以對這些method加以override,或維持和abstract class相同的功能。Design Pattern中的template method,factory method...等就是用這種手法。

或者更明白的說,我們知道在OO主要有兩種技術:繼承(Inheritance)和組合(Composition),而abstract class就是用在使用繼承技術時,而interface則是用在使用組合技術時。

使用繼承技術時,我們會將所有method由abstract class去宣告,然後由各子類別去override,若不得已某些class有自己的特殊method,則由該class自行宣告。

一旦使用組合時時,就牽涉到一個問題,你如何確保被你組合的物件有某個method呢?當你使用繼承時,因為所有的method都會被繼承,這不是問題,但組合就不一樣了,所以你必須建立一個interface,強迫要被你組合的物件,需實做這個interface,這樣當你要使用該物件時,才能確保有某個method可以呼叫。

Sample Code
以Door為例,Door是一個泛稱,適合當abstract class,定義出open()和close(),由於一般們都是水平左右開,所以可以將左右開的功能放在abstract class,今天有一個垂直上下開的門VerticalDoor,門是水平開的,明顯和abstract class不一樣,所以使用了override的方式去改寫,在此範例我們使用了『繼承』的技術。

UML
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)

C++

 1 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)/**/ /* 
 2(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(C) OOMusou 2007 http://oomusou.cnblogs.com
 3(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
 4(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Filename    : DoorInheritance.cpp
 5(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Description : Demo how to use abstract class
 7(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Release     : 05/07/2007 1.0
 8(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)*/

 9 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
10 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < iostream >
11 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < vector >
12 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < algorithm >
13 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < functional >
14 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
15 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) using   namespace  std;
16 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
17 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
18(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
19(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  virtual void open() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
20(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "open horizontally" << endl;
21(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

22(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
23(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  virtual void close() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
24(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "close horizontally" << endl;
25(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

26(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
27 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
28 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  HorizontalDoor :  public  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
29(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
30 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
31 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  VerticalDoor :  public  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
32(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
33(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void open() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
34(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "open vertically" << endl;
35(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

36(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
37(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void close() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
38(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "close vertically" << endl;
39(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

40(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
41 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
42 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  DoorController  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
43(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)protected:
44(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  vector<Door*> _doorVec;
45(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
46(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
47(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void addDoor(Door& aDoor) (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
48(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _doorVec.push_back(&aDoor);
49(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

50(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
51(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void openDoor() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
52(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    for_each(_doorVec.begin(), _doorVec.end(), mem_fun(&Door::open));
53(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

54(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
55 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
56 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
57 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) int  main()  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
58(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  DoorController dc;
59(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.addDoor(HorizontalDoor());
60(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.addDoor(VerticalDoor());
61(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.openDoor();
62(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}


C#

 1 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)/**/ /* 
 2(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(C) OOMusou 2007 http://oomusou.cnblogs.com
 3(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
 4(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Filename    : DoorInheritance.cs
 5(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Compiler    : Visual Studio 2005 / C# 2.0
 6(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Description : Demo how to use abstract class
 7(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Release     : 05/07/2007 1.0
 8(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)*/

 9 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) using  System;
10 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) using  System.Collections.Generic;
11 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
12 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
13(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public virtual void open() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
14(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("open horizontally");
15(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

16(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
17(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public virtual void close() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
18(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("close horizontally");
19(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

20(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

21 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
22 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  HorizontalDoor : Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
23(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

24 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
25 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  VerticalDoor : Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
26(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public override void open() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
27(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("open vertically");
28(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

29(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
30(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public override void close() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
31(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("close vertically");
32(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

33(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

34 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
35 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  DoorController  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
36(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  protected List<Door> _doorList = new List<Door>();
37(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
38(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public void addDoor(Door aDoor) (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
39(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _doorList.Add(aDoor);
40(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

41(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
42(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public void openDoor() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
43(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    foreach(Door iter in _doorList) (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
44(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)      iter.open();
45(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    }

46(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

47(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

48 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
49 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  main  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
50(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public static void Main() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
51(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    DoorController dc = new DoorController();
52(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.addDoor(new HorizontalDoor());
53(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.addDoor(new VerticalDoor());
54(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.openDoor();
55(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

56(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}


執行結果

(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)open horizontally
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)open vertically

假如日後需求改變,需要一個會警報的門AlarmDoor,由於廠商本身沒有生產警報器,所以勢必外包,這時他將規格定義成IAlarm interface,只要能生產出這個規格的Alarm,就可以透過『組合』的方式產生出會警報的門,在此範例我們使用『組合』技術。

UML(以下這個圖我畫錯了,_alarm應該在AlarmDoor內,感謝frank28_nfls的指正,C++與C#的code是對的)
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)


C++

 1 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)/**/ /* 
 2(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(C) OOMusou 2007 http://oomusou.cnblogs.com
 3(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
 4(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Filename    : DoorInheritance.cpp
 5(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Description : Demo how to use interface
 7(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Release     : 05/07/2007 1.0
 8(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)*/

 9 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
10 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < iostream >
11 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < vector >
12 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < algorithm >
13 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)#include  < functional >
14 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
15 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) using   namespace  std;
16 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
17 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
18(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
19(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  virtual void open() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
20(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "open horizontally" << endl;
21(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

22(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
23(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  virtual void close() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
24(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "close horizontally" << endl;
25(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

26(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
27 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
28 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  HorizontalDoor :  public  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
29(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
30 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
31 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  VerticalDoor :  public  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
32(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
33(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void open() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
34(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "open vertically" << endl;
35(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

36(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
37(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void close() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
38(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "close vertically" << endl;
39(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

40(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
41 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
42 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  IAlarm  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
43(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
44(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  virtual void alert() const = 0;
45(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
46 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
47 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  Alarm :  public  IAlarm  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
48(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
49(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void alert() const (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
50(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    cout << "ring,ring,ring" << endl;
51(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

52(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
53 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
54 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  AlarmDoor :  public  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
55(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)protected:
56(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  IAlarm* _alarm;
57(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
58(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
59(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  AlarmDoor() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
60(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _alarm = new Alarm;
61(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

62(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
63(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  ~AlarmDoor() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
64(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    delete _alarm;
65(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

66(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
67(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
68(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void alert() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
69(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _alarm->alert();
70(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

71(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
72 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
73 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  DoorController  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
74(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)protected:
75(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  vector<Door*> _doorVec;
76(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
77(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)public:
78(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void addDoor(Door& aDoor) (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
79(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _doorVec.push_back(&aDoor);
80(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

81(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
82(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void openDoor() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
83(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    for_each(_doorVec.begin(), _doorVec.end(), mem_fun(&Door::open));
84(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

85(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}
;
86 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
87 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) int  main()  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
88(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  DoorController dc;
89(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.addDoor(HorizontalDoor());
90(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.addDoor(VerticalDoor());
91(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.addDoor(AlarmDoor());
92(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dc.openDoor();
93(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
94(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  Door& door = AlarmDoor();
95(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  dynamic_cast<AlarmDoor&>(door).alert();
96(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}


C#

 1 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)/**/ /* 
 2(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(C) OOMusou 2007 http://oomusou.cnblogs.com
 3(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
 4(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Filename    : DoorInheritance.cs
 5(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Compiler    : Visual Studio 2005 / C# 2.0
 6(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Description : Demo how to use interface
 7(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)Release     : 05/07/2007 1.0
 8(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)*/

 9 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
10 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) using  System;
11 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) using  System.Collections.Generic;
12 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
13 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) abstract   class  Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
14(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public virtual void open() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
15(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("open horizontally");
16(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

17(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
18(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public virtual void close() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
19(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("close horizontally");
20(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

21(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

22 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
23 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  HorizontalDoor : Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
24(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

25 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
26 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  VerticalDoor : Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
27(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  override public void open() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
28(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("open vertically");
29(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

30(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
31(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  override public void close() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
32(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("close vertically");
33(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

34(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

35 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
36 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) interface  IAlarm  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
37(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  void alert();
38(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

39 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
40 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  Alarm : IAlarm  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
41(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public void alert() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
42(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Console.WriteLine("ring,ring,ring");
43(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

44(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

45 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
46 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  AlarmDoor : Door  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
47(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  private IAlarm _alarm;
48(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
49(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public AlarmDoor() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
50(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _alarm = new Alarm();
51(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

52(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
53(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public void alert() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
54(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _alarm.alert();
55(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

56(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

57 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
58 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  DoorController  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
59(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  protected List<Door> _doorList = new List<Door>();
60(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
61(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public void addDoor(Door aDoor) (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
62(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    _doorList.Add(aDoor);
63(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

64(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
65(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public void openDoor() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
66(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    foreach (Door iter in _doorList) (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
67(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)      iter.open();
68(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    }

69(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

70(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}

71 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
72 (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) class  main  (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#) {
73(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  public static void Main() (原創) interface和abstract class有何不同? (C/C++) (.NET) (C#){
74(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    DoorController dc = new DoorController();
75(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.addDoor(new HorizontalDoor());
76(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.addDoor(new VerticalDoor());
77(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.addDoor(new AlarmDoor());
78(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    dc.openDoor();
79(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  
80(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    Door door = new AlarmDoor();
81(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)    ((AlarmDoor)(door)).alert();
82(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)  }

83(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)}


執行結果

(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)open horizontally
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)open vertically
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)open horizontally
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)ring
, ring , ring


值得注意的是,我並沒有將Door()這個abstract class加上alert(),因為alert()並非所有門都有,所以不應該放在abstract class,另外abstract class也不該隨意更改,所以才會說,abstract class和interface在設計時非常重要,整個多型的技術都是靠interface和abstract class支撐,只要interface或abstract class一變,整個多型機制就瓦解了。

Conclusion
interface和abstract class的差異,重點是在用的地方完全不同,而非僅是語法上的小差異,若從語言差異的角度去看interface和abstract class,當然會搞的一頭霧水,若從OO和Design Pattern的角度去看,才能較容易分辨interface和abstract的異同。

See Also
(原創) 我對interface的理解 (初級) (C/C++) (Design Pattern)


转载请注明本文地址:(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)

相关文章:

  • 2021-11-18
  • 2021-08-26
  • 2022-02-04
  • 2022-12-23
  • 2021-11-13
  • 2021-05-24
  • 2021-09-27
  • 2022-01-18
猜你喜欢
  • 2021-07-31
  • 2021-09-27
  • 2022-12-23
  • 2021-10-20
  • 2022-01-31
  • 2022-12-23
相关资源
相似解决方案