0

ここに私のセットアップがあり、コメントは私がやりたいことを示しています:

class Process
{
    void SomeMethod()
    {
        // Here I want to call Parent.MethodToCall()
    }
}

class Controller
{
    Process c = new Process();

    void MethodToCall()
    {
    }
}

これで、クラスController.MethodToCall()のライフサイクル全体で何度も呼び出されます。Process

呼び出す必要があるのは親メソッドだけなのでevent、ハンドラーを削除することはなく、呼び出しが 1 回しかないため、を使用すると少し無駄になると思います。

したがって、これを回避するために現在使用している方法は次のとおりです。

class Process
{
    public Func<void> Method { get; set; }

    void SomeMethod()
    {
        Method();
    }
}

class Controller
{
    Process c = new Process() { Method = MethodToCall }

    void MethodToCall()
    {
    }
}

まず、構文が完璧ではない可能性があるため、すぐにメモ帳で調べました。

私の質問: 私がやっていることは非常に面倒に見えるので、私が望むものを達成するための最良の方法は何ですか?...または、デザインの観点からこれについて完全に間違った方法で考えていますか?

基本的に、私がやりたいことは、Controller クラスのメソッドを public にせずに呼び出すことです。なぜなら、それが public である場合、単に Controller をパラメータとして Process に渡すことができるからです。

4

4 に答える 4

3
class Child
{
    Parent parent=null;
    public Child(Parent p)
    {
      parent=p;
    }
    void SomeMethod()
    {           
        parent.MethodToCall();
    }
}
于 2013-03-21T16:19:59.440 に答える
2

これは、それを行う方法の良い例です

class Child : Parent
{
    private void SomeMethod()
    {
        base.MethodToCall();
    }
}

class Parent
{
    Child c = new Child();

    protected void MethodToCall()
    {
        c.MethodToCall();//not sure if you are wanting to call c.MethodToCall();
    }
}
于 2013-03-21T16:28:34.303 に答える
1

さて、OOP 用語では、正しい答えは次のようになります。

class Child : Parent
{
    void SomeMethod()
    {
        base.MethodToCall();
    }
}

class Parent
{
    protected void MethodToCall()
    {
       // protected methods are accesible from
       // descendants and private from outside
    }
}

ただし、集約を使用すると、いつでも継承を回避できます

于 2013-03-21T16:21:50.933 に答える
0

あなたがやっていることは、本質的にあなた自身のイベントを展開することです。内部的には、イベント ハンドラーはイベントにアタッチされたデリゲートにすぎませんが、イベントの所有者だけがイベントを発生させることができるという 1 つの違いがあります。

于 2013-03-21T16:21:17.883 に答える