質問

多数の仮想メソッドを持つ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メソッドを空にします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top