4

次のインターフェイスがあるとします。

public interface IFoo
{
    bool Foo(Person a, Person b);
}

上記の次の2つの実装:

public class KungFoo : IFoo
{
    public bool Foo(Person a, Person b)
    {
        if (a.IsAmateur || b.IsAmateur) // common logic
          return true;
        return false;
    }
}

public class KongFoo : IFoo
{
    public bool Foo(Person a, Person b)
    {
        if (a.IsAmateur || b.IsAmateur) // common logic
          return false;
        return true;
    }
}

「共通論理」(コードでコメントされている)をどこに配置すれば、1つの場所(たとえばFuncとして)に配置され、複数の実装で(上記の場合のように)繰り返す必要がなくなりますか?

上記の例は非常に簡単ですが、実際の「共通論理」はより複雑であり、Foo()メソッドは何か便利なことをします。

質問が明確であることを願っています(そして、他の場所ではまだ回答されていません-私は検索を行いました)が、必要に応じて詳細を調べてください。

4

5 に答える 5

9

一般的な抽象クラスでは:

public interface IFoo
{
    bool Foo(Person a, Person b);
}

public abstract class FooBase : IFoo
{
    public virtual bool Foo(Person a, Person b)
    {
        if (a.IsAmateur || b.IsAmateur) // common logic
          return true;
        return false;
    }
}

public class KungFoo : FooBase
{

}

public class KongFoo : FooBase
{
    public override bool Foo(Person a, Person b)
    {
        // Some other logic if the common logic doesn't work for you here
    }
}
于 2012-09-27T10:38:26.813 に答える
1

一般的なメソッドに基本クラスを使用できますが、仕様パターンを使用して、一般的なロジック(またはビジネスルール)をかなり適切に外部化できます。

そこにはたくさんの言葉の例とホワイトペーパーがあります、あなたがその種のもので大丈夫ならそれらを読んでください(私はそれが少しアカデミック志向であると思います)、しかしそこには良い紹介があるようです:

http://devlicio.us/blogs/jeff_perrin/archive/2006/12/13/the-specification-pattern.aspx

于 2012-09-27T10:49:49.447 に答える
0

私はac#開発者ではありませんが、親クラスを実際のクラスに変更し、その中にメソッドを実装する必要があると思います。もちろん、他の実装されていないメソッドを追加する場合は、抽象クラスを宣言しますが、これはどのように見えるかです。

public abstract class IFoo{
   bool Foo(Person a, Person b){
      if (a.IsAmateur || b.IsAmateur) // common logic
         return true;
   }
   public abstract Object otherFooMethod(Object o);
}

そして、あなたの子供のクラスでは、あなたはそれを次のように使うでしょう:

public class KungFoo : IFoo{
   //Foo already implemented

   public Object otherFooMethod(Object o){
      return o;
   }

}

public class KongFoo : IFoo
{
   public bool Foo(Person a, Person b)
   {
       if (a.IsAmateur || b.IsAmateur) // common logic
         return false;
       return !base.Foo();
   }

   public Object otherFooMethod(Object o){
      return o;
   }
 }
于 2012-09-27T10:53:41.747 に答える
0
  • protected適切なすべてのクラスに継承され、メソッドとして機能を提供するクラスを実装できます。

  • できれば、拡張メソッドを実装することをお勧めします。これは、特定の継承階層でこのロジックを使用することを制限せず、代わりにタイプまたはインターフェイスを共有するすべてのクラスで使用できるためです。

于 2012-09-27T10:40:11.010 に答える
0

次のような抽象基本クラスを使用します。

public interface IFoo
{
    bool Foo(Person a, Person b);
}

public class KungFoo : FooImpl
{
    public override bool Foo(Person a, Person b)
    {
        if (this.IsAmateur(a, b))
            return true;
        return false;
    }
}

public class KongFoo : FooImpl
{
    public override bool Foo(Person a, Person b)
    {
        if (this.IsAmateur(a, b))
            return false;
        return true;
    }
}

public abstract class FooImpl : IFoo
{
    public abstract bool Foo(Person a, Person b);

    protected readonly Func<Person, Person, bool> IsAmateur = (a, b) => a.IsAmateur || b.IsAmateur;
}

public class Person
{
    public bool IsAmateur { get; set; }
}
于 2012-09-27T10:43:35.080 に答える