それらは確かに似ており、両方を使用して多くのことを達成できます。
次のクラスを検討してください。
public abstract class PersonBase
{
public string Name { get; set; }
public DateTime BirthDate { get; set; }
public PersonBase(string name, DateTime bd)
{
this.Name = name;
this.BirthDate = bd;
}
public int CalculateAge()
{
return DateTime.Now.Year - BirthDate.Year;
}
public abstract string HealthRecord { get; set; }
public abstract string DisplayData();
}
public class TeenagerPerson : PersonBase
{
public PersonBase BestFriendForever { get; set; }
public override string HealthRecord { get; set; }
public TeenagerPerson(string name, DateTime bd)
: base(name, bd)
{
}
public override string DisplayData()
{
return string.Format("Name:{0} Age:{1} Health record:{2} BFF:{3}", Name, CalculateAge(), HealthRecord, BestFriendForever.Name);
}
}
public class AdultPerson : PersonBase
{
public override string HealthRecord { get; set; }
public AdultPerson(string name, DateTime bd)
: base(name, bd)
{
}
public override string DisplayData()
{
return string.Format("Name:{0} Age:{1} Health record:{2}", Name, CalculateAge(), HealthRecord);
}
}
このサンプルでは、抽象基本クラスを使用していくつかの共通プロパティを提供し、派生クラスも独自のプロパティを宣言できるようにします。このソリューションでは、クラスのコンテンツを外の世界に表示する DisplayData() メソッドを実装するように派生クラスを強制します - もちろん、彼らは喜んでいます。
コードのテスト:
var teenager = new TeenagerPerson("Joanne", new DateTime(2000, 11, 05));
teenager.BestFriendForever = new TeenagerPerson("Julia", new DateTime(2000, 10, 05));
Console.WriteLine(teenager.DisplayData());
var adult = new AdultPerson("Mike", new DateTime(1960, 01, 03));
adult.HealthRecord = "2003 - Heart Bypass";
Console.WriteLine(adult.DisplayData());
次の出力が得られます。
名前:ジョアン 年齢:13歳 健康記録:BFF:ジュリア
名前:マイク 年齢:53歳 健康記録:2003年 - 心臓バイパス
抽象クラスを操作するオプションは無限であり、インターフェイスと同じくらい用途が広いと思います。もちろん、抽象クラスの欠点は、C# には多重継承がないため、継承のワンショットが既に抽象クラスで使用されていることです。
PS: 年齢の計算がうまくいかないことに気付きました。timespan を使用したほうがよいかもしれません。:)