Abstract(抽象類別)與Interface(介面)的差異

  • 108
  • 0
  • C#
  • 2024-07-10

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可以有多重繼承。