4

多くの仮想メソッドを持つ ac# クラスがあります。これらのメソッドの一部は本質的に抽象的です (サブクラスで完全に実装され、基本クラスは空です)。

コンパイルするには、何をすべきかについてのコメントを付けて、基本クラスに 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
    }

}

これが理にかなっていることを願っています

4

2 に答える 2

15

基本クラスを抽象としてマークし、実装されていないメソッドも同様にマークします。

そのようです

public abstract class BaseClass
{

    public abstract void AbstractMethod();
}

public class SubClass: BaseClass
{
    public override void AbstractMethod()
    {
        //Do Something
    }
}

抽象クラスの外に抽象メソッドを持つことはできません。クラスを抽象としてマークすると、インスタンス化できなくなります。しかし、それでは意味がありません。とにかくメソッドを実装していないクラスで何をするつもりですか?

編集:あなたのクラスを見ると、ええ、私は UpdatePerson メソッドとともに PersonComponent を抽象化します。または、UpdatePerson が PersonComponent に対して何もしない場合はそのままにして、PersonComponent の UpdatePerson メソッドを空にします。

于 2009-03-05T01:56:52.383 に答える
1

オブジェクト階層について考えてください。すべての派生クラスに共通のコードを共有し、基本クラスに基本機能を実装しますか?

基本コードを共有する場合は、テンプレート パターンに注意してください。パブリック メソッドを使用し、コア/共有実装で保護された仮想メソッドにチェーンします。共有実装メソッド名は「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());
    }
}
于 2009-03-05T09:48:57.740 に答える