次の例では、抽象クラスとインターフェイスを定義します。抽象クラスは携帯電話の属性とメソッドを定義し、インターフェイスはゲームをプレイするためのメソッドを定義します。
抽象クラスコード:
//抽象类是一个父类+约束 父类是为了实现代码重用 约束是为了多态变化 单继承 is a
public abstract class BasePhone
{
public int Id { get; set; }
public string Name { get; set; }
public string Branch { get; set; }
public abstract void System();//约束下子类有这个方法 但又各不相同
public void Call()
{
Console.WriteLine($"Use {this.GetType().Name} Call");
}
public void SendMsg()
{
Console.WriteLine($"Use {this.GetType().Name} SendMsg");
}
}
インターフェースコード:
//接口就是一个约束 一个类可以实现多个接口 告诉别人一定有什么功能 can do
public interface IExted
{
void PlayGame();
}
Xiaomi携帯電話クラスを定義し、抽象クラスBasePhoneを継承し、インターフェイスを実装します。
public class Mi : BasePhone, IExted
{
public void PlayGame()
{
Console.WriteLine($"Use {this.GetType().Name} PlayGame");
}
public override void System()
{
Console.WriteLine($"{this.GetType().Name} System is Android ");
}
}
Apple携帯電話クラスを定義し、抽象クラスBasePhoneを継承して、インターフェイスを実装します。
public class iPhone : BasePhone, IExted
{
public void PlayGame()
{
Console.WriteLine($"Use {this.GetType().Name} PlayGame");
}
public override void System()
{
Console.WriteLine($"{this.GetType().Name} System is IOS ");
}
}
オブジェクトをインスタンス化し、メソッドを呼び出します。
class Program
{
static void Main(string[] args)
{
iPhone iphone = new iPhone();
iphone.System();
iphone.Call();
iphone.SendMsg();
iphone.PlayGame();
iphone.Id=1;
Mi mi = new Mi();
mi.System();
mi.Call();
Console.ReadLine();
}
}
結果:
Apple携帯電話とXiaomi携帯電話はどちらも、通話(Call)やテキストメッセージの送信(SendMsg)などの共通の属性とメソッドを持っていますが、オペレーティングシステムが異なるため、オペレーティングシステムメソッド(System)は抽象的なメソッドとして定義されています。親クラス(BasePhone)が実装されていない場合、サブクラスはオペレーティングシステムのこのメソッドを書き換えます。
同時に、Apple電話とXiaomi電話の両方がゲームをプレイできるため、ゲームをプレイするメソッド(PlayGame)はインターフェイスで定義され、インターフェイスを実装するクラスはインターフェイスで各メソッドを実装する必要があります。このように、Appleの携帯電話とXiaomiの携帯電話の両方にゲームをプレイする方法があります。
ゲームをプレイするメソッドが抽象クラスではなくインターフェースで定義されている理由。これが考慮事項です。ゲームをプレイできる携帯電話に加えて、タブレットやテレビもゲームをプレイできますが、タブレットやテレビは電話をかけたり、テキストメッセージを送信したりすることはできません。
総括する:
抽象クラスは、親クラス+制約として理解できます。親クラスはコードの再利用用であり、制約はポリモーフィックな変更用です。抽象クラスは単一の継承のみが可能です。抽象クラスの概念を英語で表現するために、それが何であるかを意味する「is a」として表現することができます。たとえば、上記の例のBasePhoneは携帯電話を意味します。
インターフェイスは純粋な制約であり、使用可能な機能を他の人に伝えます。英語では、インターフェースの概念は「できる」と表現できます。これは、何ができるかを意味します。
実際の開発では、最初にインターフェースの使用を検討し、再利用する必要のあるコードがある場合は、抽象クラスの使用を検討してください。