介面 Interface 的特點 1
只要一個類別繼承了一個介面,這個類別就必須實現這個介面中的所有成員。
1
2
3
4
5
6
7
8
9
10
11
//Person類別繼承IFlyable介面
public class Person : IFlyable {
//實作IFlyable介面中所有成員
//注意,實作方法並沒有override,有override叫做重寫
public void Fly() { ... }
}
public interface IFlyable {
//介面中的所有成員
void Fly();
}
注意,實作方法並沒有override,有override叫做重寫
為了多型(Polymorphism),介面interface不能被實體化
為了多型(Polymorphism),介面interface不能被實體化
也就是說,介面interface不能new創建對象(物件)。
錯誤寫法:
1
IFlyable fly = new IFlyable(); //不可以
介面不可以被實體化,抽象類abstract、靜態類static也是。
為什麼不能被實體化?
他們有實現嗎?沒有,所以創建它沒有意義。
範例:介面實現多型
如果想要實現多型的話,就去指向子類對象Person
用介面調用子類的fly
既可以表現人類的特徵,也可以表現鳥類的特徵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//如果想要實現多型的話,就去指向子類對象Person
IFlyable fly = new Bird();//new Person();//介面IFlyable指向子類對象Person
fly.Fly(); //用介面調用子類的fly
Console.ReadKey();
//子類
public class Person : IFlyable {
public void Fly() {
Console.WriteLine("人類在飛");
}
}
public class Bird : IFlyable {
public void Fly() {
Console.WriteLine("鳥在飛");
}
}
//介面
public interface IFlyable {
void Fly();
}
介面與介面之間可以繼承,並且可以多繼承
範例:介面多繼承
有一個介面SuperInterface,繼承了三個介面,
Car類別 繼承了SuperInterface,
這時候,Car類別就必須實作 所有介面的方法。(少實作一個方法都不行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public interface M1 {
void Test1();
}
public interface M2 {
void Test2();
}
public interface M3 {
void Test3();
}
//SuperInterface介面繼承了三個介面 M1, M2, M3
public interface SuperInterface : M1, M2, M3 {
//SuperInterface不需要實作 M1, M2, M3
//因為它是介面,實作的事由繼承它的類別來作
}
//Car類別繼承了SuperInterface介面,必須實作所有介面中的方法,少一個都不行
public class Car : SuperInterface
{
void M1.Test1() {
throw new NotImplementedException();
}
void M2.Test2() {
throw new NotImplementedException();
}
void M3.Test3() {
throw new NotImplementedException();
}
}
介面只能繼承介面
介面並不能去繼承一個類別,而類別可以繼承介面。
(介面只能繼承於介面,而類別可以繼承介面,也可以繼承類別)
錯誤範例
1
2
3
4
5
6
7
8
9
10
11
12
//介面
//報錯:介面並不能去繼承一個類別,而類別可以繼承介面
public interface M3: Person //報錯
{
void Test3();
}
//類別
public class Person {
public void Fly() {
Console.WriteLine("人類在飛");
}
}
繼承同時類別跟介面,類別在前,介面在後
一個類別可以同時繼承一個類別,並實現多介面,如果一個子類同時繼承了父類A,並實現了介面IA,那麼在語法上A必須寫在IA的前面。
1
class MyClass: A, IA {...}` //因為類別是單繼承的
範例:類別同時繼承class和interface
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person : IFlyable {
public void Fly() {
Console.WriteLine("人類在飛");
}
}
//錯誤寫法:報錯-基底Person類別必須在任何介面之前
//public class Student : IFlyable, Person { } //報錯
public class Student : Person, IFlyable {
public void Fly() {
Console.WriteLine("學生在飛");
}
}
也就是說,一個類別同時繼承了類別跟介面,語法上必須先寫類別(必須寫在前面)
顯示實現介面
面象對象
總結
- 介面是一種規範
只要一個類別繼承了一個介面,這個類別就必須實現這個介面中的所有成員。
為了多型(Polymorphism),介面interface不能被實體化。
也就是說,介面interface不能new創建對象(物件)。介面中的成員不能加「訪問修飾符」,介面中的成員訪問修飾符為
public,不能修改。(默認為public)介面中的成員不能有任何實現
(「光說不做」,只是定義了一組未實現的成員)
那誰去做呀?子類去做,繼承它的子類去做- 介面中只能有方法、自動屬性、索引器、事件、不能有「field(欄位/字段)」和構造函數。
- 介面與介面之間可以繼承,並且可以多繼承。
介面並不能去繼承一個類別,而類別可以繼承介面 (介面只能繼承於介面,而類別可以繼承介面,也可以繼承類別)
- 一個類別可以同時繼承一個類別,並實現多介面,如果一個子類同時繼承了父類A,並實現了介面IA,那麼在語法上A必須寫在IA的前面。
1
class MyClass: A, IA {...} //因為類別是單繼承的
明確介面實作
明確介面實作的目的:解決方法重名問題
語法
1
2
3
4
5
6
7
8
9
10
11
public class Bird : IFlyable {
public void Fly() {
Console.WriteLine("鳥會飛");
}
/// <summary>
/// 明確介面實作
/// </summary>
void IFlyable.Fly() {
Console.WriteLine("我是介面的飛");
}
}
什麼時候顯示的去實現介面?
當繼承的介面中的方法和參數一模一樣的時候,就是用明確介面實作。
當一個抽象類實現介面的時候,需要子類去實現介面。
範例:類別與介面方法 重名問題
直接顯示介面名就可以了 void IFlyable.Fly()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//明確介面實作:就是為了解決方法的重名問題
IFlyable fly = new Bird();
fly.Fly(); //調的是介面的fly,為什麼?因為fly是IFlyable介面類型
//如要調鳥的fly,要這宣告為Bird的類型↓↓↓
//不要跟override搞混了
Bird bird = new Bird();
bird.Fly(); //這調的才是鳥的fly
Console.ReadKey();
//類別
public class Bird : IFlyable
{
public void Fly() {
Console.WriteLine("鳥會飛");
}
/// <summary>
/// 明確介面實作
/// 這個強調的是介面的飛
/// 且不能加修飾符(ex:public)
/// 方法因為是在類別裡面,所以默認是 private,
/// (方法在介面裡面,默認是 public)
/// </summary>
void IFlyable.Fly() {
Console.WriteLine("我是介面的飛");
}
}
//介面
public interface IFlyable {
void Fly();
}