さて、抽象的な関係「IS-A」とインターフェース「HAS-A」の機能について疑問があります。
たとえば、次のクラスがあります。
public interface IReport
{
int code { get; set; }
String description { get; set; }
void SetReport(String description, int code);
void DeleteReport();
}
public abstract class BugReport : IReport
{
public int? code { get; set; }
public String description { get; set; }
public void IReport.SetReport(String description, int code)
{
this.description = description;
this.code = code;
}
public void IReport.DeleteReport()
{
this.description = "";
this.code = null;
}
}
BugReport クラスの実装は常に同じであることはわかっていますが、必要に応じて子クラスで拡張できます。この基準は、たとえばこのクラスで使用された場合、抽象クラスの「使用法」には一致しますが、「IS-A」関係には一致しません。
public abstract Parser : BugReport
{
}
私のパーサーは BugReport ですか? 明らかにそうではありませんが、BugReport をインターフェイスとして作成する場合、継承元のクラス全体に機能を実装する必要があるため、これが最も論理的な選択のようです。だから私が間違っていることは、IS-A関係の不一致とは無関係に抽象を使用し続ける必要がありますか、それともインターフェイスに切り替える必要がありますか?