質問
多数の仮想メソッドを持つc#クラスがありますが、これらのメソッドの一部は本質的に抽象的です(サブクラスで完全に実装され、基本クラスは空です)。
それをコンパイルするために、私は何をすべきかについてのコメントとともにInvalidOperationExceptionを基本クラスに投げています。これは汚いだけです。
クラスを設計するより良い方法はありますか?
編集: カナダで実行されるのはアプリケーションの中間層用であり、メソッドの半分は汎用であり、したがって仮想です。メソッドの半分は州固有です。
Public class PersonComponent()
{
public GetPersonById(Guid id) {
//Code to get person - same for all provinces
}
Public virtual DeletePerson(Guid id) {
//Common code
}
Public virtual UpdatePerson(Person p) {
throw new InvalidOperation("I wanna be abstract");
}
Public Class ABPersonComponent : PersonComponent
{
public override DeletePerson(Guid id)
{
//alberta specific delete code
}
public override UpdatePerson(Person p)
{
//alberta specific update codecode
}
}
これが理にかなっていることを望む
解決
オブジェクト階層について考えてください。すべての派生クラスの共通コードを共有してから、基本クラスに基本機能を実装しますか。
ベースコードを共有している場合は、テンプレートパターンに注意してください。パブリックメソッドを使用し、コア/共有実装で保護された仮想メソッドにチェーンします。共有実装のメソッド名を" Core"で終了します。
例:
public abstract class BaseClass
{
protected virtual void DeletePersonCore(Guid id)
{
//shared code
}
public void DeletePerson(Guid id)
{
//chain it to the core
DeletePersonCore(id);
}
}
public class DerivedClass : BaseClass
{
protected override void DeletePersonCore(Guid id)
{
//do some polymorphistic stuff
base.DeletePersonCore(id);
}
}
public class UsageClass
{
public void Delete()
{
DerivedClass dc = new DerivedClass();
dc.DeletePerson(Guid.NewGuid());
}
}
他のヒント
基本クラスを抽象としてマークし、同様に実装のないメソッドをマークします。
そう
public abstract class BaseClass
{
public abstract void AbstractMethod();
}
public class SubClass: BaseClass
{
public override void AbstractMethod()
{
//Do Something
}
}
抽象クラスの外部に抽象メソッドを含めることはできません。クラスを抽象としてマークすると、インスタンスを作成できなくなります。しかし、それは意味がありません。とにかくメソッドを実装しないクラスで何をするつもりですか?
編集:クラスを見て、UpdatePersonメソッドとともにPersonComponentを抽象化します。それか、UpdatePersonがPersonComponentに対して何もしない場合はそのままにして、PersonComponentのUpdatePersonメソッドを空にします。