3

クラス全体の継承ではなく、メソッドの継承のような機能があるかどうか疑問に思っています。説明しようとしていることを詳しく説明します。

class a {
   public void GetA(){
     // some logic here
}
}

class b {
    public void GetB() : new Class().GetA()
}

奇妙に見えることは知っていますが、オブジェクトコンポジションパターンで委任を行う方法を読んでいて、なぜかこのパターンを考えました。

4

7 に答える 7

4

合成を行う一般的な方法は、クラスb、タイプクラスaのプライベートメンバー変数を作成し、GetB()でa.GetA()を呼び出すことです。例えば:

class a {
   public void GetA(){
     // some logic here
   }
}

class b {
    private a _a=new a();

    public void GetB()
    {
         _a.GetA();
    } 
}

別のオプションは、単純なメソッドの代わりにGetBと呼ばれるデリゲートメンバー変数を定義し、呼び出し元のコードがGetB()によって実行されるコードを提供できるようにすることです。

于 2009-12-29T02:49:32.827 に答える
4

GetB()内でGetA()を呼び出したいが、GetB()でクラスaのインスタンスを定義または明示的に参照したくない場合は、GetA()をデリゲートとして渡すことができます。

C#には、 ActionFuncなどの事前定義されたデリゲートが多数あります。または、メソッドのシグネチャに一致するように、いつでも独自のデリゲートをロールすることができます。

    class a
    {
        public void GetA()
        {
            Console.WriteLine("Hello World!");
        }
    }

    class b
    {
        // No explicit reference to class a of any kind.
        public void GetB(Action action)
        {
            action();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new a();
            var b = new b();

            b.GetB(a.GetA);
        }
    }
于 2009-12-29T02:57:39.363 に答える
3

私が考えることができる最も近いことは、C#で、次のように、クラスのコンストラクターをその子クラス(または同じクラスのオーバーロードされたコンストラクター)のコンストラクターに「継承」する方法です。

class Animal {
    public string Species { get; set; }

    public Animal(string species) {
        Species = species;
    }
}

class Human : Animal {
    public string Name { get; set; }

    public Human(string name) : base("Homo sapien") {
        Name = name;
    }
}

上記のコードの動作は非常に単純です。クラスHumanのコンストラクターは、基本的に、他のことを行う前にクラスのコンストラクターを呼び出しAnimalます。なぜこの同じ機能がコンストラクター以外のメソッドで利用できないのか、私にはわかりません。

于 2009-12-29T02:54:05.003 に答える
1

これは不可能です。b.GetBの機能を再利用する場合は、をインスタンス化して呼び出すa.GetA必要があります。aa.GetA

于 2009-12-29T02:43:49.187 に答える
0

少し異なるアプローチは、直接インスタンス化するのではなくClassA、のコンストラクターでのインスタンスを受け入れることです。ClassBこれは、依存性逆転の原則を@Ashの答えに適用することになります。

public class ClassB
{
    private readonly ClassA _a;

    public b(ClassA a)
    {
        _a = a;
    }

    public void GetB()
    {
        _a.GetA();

        // Other logic
    }
}
于 2009-12-29T03:12:01.970 に答える
0
public class Article
{

 public object AddOrUpdate(params object[] paras){

   return null;

  }

}

public class Test:Article
{

 public new object AddOrUpdate(params object[] paras){

   //do your logic......

    return base.AddOrUpdate(paras);

 }


}

これは、クラスがBASEオブジェクトプロパティを取得または設定できることを意味します。

デリゲートを使用する場合は、同じロジックでより多くの作業を実行する必要があります。

ただし、デリゲートは、異なるドメインオブジェクトを取得して、より多くのアプリを超える処理を実行できます。

于 2009-12-29T03:17:16.280 に答える
0

GetA()が静的メソッドに変更された場合は、GetB()関数内で呼び出すだけです。

class a { 
   public static void GetA() { 
     // some logic here 
   } 
} 

class b { 
    public void GetB() {
      a.GetA();
    }
} 

GetA()が静的でない場合、GetA()は定義上、オブジェクトコンテキスト(たとえば、非表示の「this」ポインタ)を必要とするため、意味がありません。クラスAはクラスBについて何も知らないため、オブジェクトBのインスタンスをクラスAに渡すことはできません。

あなたは本当に何をしようとしていますか?

于 2009-12-29T03:36:25.400 に答える