1

後で呼び出されるデリゲート メソッドをカプセル化したいと考えています。このデリゲート メソッドは、呼び出されると、その時点でいくつかの引数を計算し、その値をクラス外の変数に割り当てて返します。

たとえば、私はクラスツールを持っています

このツールは、デリゲート メソッドが呼び出されたときに、たとえば Point を生成する必要があります...

public delegate void Action();

class Tool
{
public Action Select;
public Action Cancel;
public Point position;
public Tool(ref Point outPoint) //Cannot use ref with lambda...
{
Select = () => outPoint = position;
}

public void Update(Point newPosition)
{
position = newPosition
}
public void UpdateKey(Keys k, bool IsPress)
{
//Invoke Select/Cancel when press some keys
}

}

ここで達成しようとしているのは、入力を受け取り、Select が呼び出された後に正しい引数を入力する単純な関数です。これが単一のメソッドである場合は、ref を使用して簡単に実行できます。ただし、多くの引数を追跡する必要があるため、クラスに変換する必要があります。もう 1 つのことは、この呼び出しはクラス内で発生するため、クラス内から計算された値を返すことができないということです。update メソッドがクラスの外部から更新されるように設計を変更することもできますが、私が望むのは、クラスが独自の更新ルーチンを管理することです。もっと良い方法があるはずだと思うので、もしあれば教えてください。

4

2 に答える 2

1

Point が構造体の場合、OutPoint を含むクラスが必要です。

class OutPointContainer { //Please, think of a better name :)
    public Point OutPoint{ get; set; }
}

class Tool
{
public Action Select;
public Action Cancel;
public Point position;

public Tool(OutPointContainer outPointContainer)
{
    Select = () => outPoint.OutPoint = position;
}

public void Update(Point newPosition)
{
position = newPosition
}
public void UpdateKey(Keys k, bool IsPress)
{
//Invoke Select/Cancel when press some keys
}

}

後で、常に Point from を使用しますOutPointContainer.OutPoint

于 2012-06-10T15:11:57.620 に答える
0

Pointはクラスであるため、完全な参照ではなく、いつでもその値を変更できます。

public Tool(OutPointContainer outPointContainer)
{
    Select = () => outPoint.UpdateWith(position);
}

そして、メソッドUpdateWithは次のようなことをします:

public void UpdateWith(Point other){
    this.X = other.X;
    this.Y = other.Y;
}
于 2012-06-10T15:14:18.243 に答える