Abstract與Interface的使用時機差異!!
抽象概念先想一下,下列情境題:
我們在玩卡牌遊戲(遊戲王),陷阱卡、魔法卡、怪獸卡都繼承了Card這類別,但我們能然可以new Card()來建立一張新的卡牌,那這張卡牌屬於甚麼類型的卡牌….是不是覺得怪怪的!!
貓與狗都為動物,貓與狗都繼承了Animal類別,但直接new Animal(),這樣這實體動物算哪一種動物!?
我與正在看這篇文章的你皆為工程師,我跟你都繼承的工程師這類別,但我們可以直接new 工程師(),這類別嗎!?
Abstract(抽象類別):
負責定義共通的特性,例如貓與狗為動物或哺乳類為基底,可以吃、叫、睡,但是每個動物行為方式不一樣,所以將這些寫成基本特性,寫成抽象類別與方法。而它們本身不應該被實體化為一個物件,這樣類別我們就應該把它設計為抽象類別。
宣告Cat及Dog類別並繼承Animal類別,而Animal類別宣告為abstract(抽象類別),abstract的類別不能被new,Animal基底類別定義的Eat方法,讓各自衍生類別依據本身行為模式去實作Eat方法。
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("White");
cat.Eat();
Console.WriteLine(cat.color);
Dog dog = new Dog("Black");
dog.Eat();
Console.WriteLine(dog.color);
Console.ReadLine();
}
}
public abstract class Animal
{
public string color = "";
public Animal(string color)
{
this.color = color;
}
public abstract void Eat();
}
public class Cat : Animal
{
public Cat(string color) : base(color) { }
public override void Eat()
{
Console.WriteLine("Cat is eating.");
}
}
public class Dog : Animal
{
public Dog(string color) : base(color) { }
public override void Eat()
{
Console.WriteLine("Dog is eating.");
}
}
Interface(介面):
用來定義不同種類的物件,所需要具備的共通特性,例如移動,人類和狗是兩種不同種類的類別,但有相同移動的特性。
這裡的例子是因為比較的類別為不同種類,因此用Interface,定義IAction介面,因為Cat和Person都會移動,因此都繼承IAction介面且必須各自實作Move方法。
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("White");
cat.Move();
Person person = new Person();
person.Move();
Console.ReadLine();
}
}
public abstract class Animal
{
public string color = "";
public Animal(string color)
{
this.color = color;
}
public abstract void Eat();
}
public interface IAction
{
void Move();
}
public class Cat : Animal, IAction
{
public Cat(string color) : base(color) { }
public override void Eat()
{
Console.WriteLine("Cat is eating.");
}
public void Move()
{
Console.WriteLine("walk on four feet");
}
}
public class Person : IAction
{
public void Move()
{
Console.WriteLine("walk on two feet");
}
}
抽象類別是對類別抽象,提供基底及給同性質的類別繼承。
介面是對行為抽象,任何類別繼承介面並且實作,皆有此行為。
另外在設計上需要注意C#世界裡,class只能單一繼承,Interface可以有多重繼承。