36

これは、私が見た以前の回答とは少し異なる質問であるか、私はそれを取得していません。MyMethod()名前付きのメソッドと変数を持つ親クラスがありますpublic Int32 CurrentRow;

public void MyMethod()
{    
     this.UpdateProgressBar();    
}

親で、次の新しいインスタンスを作成しますChildClass

Boolean loadData = true;
if (loadData) 
{    
     ChildClass childClass = new ChildClass();    
     childClass.LoadData(this.Datatable);    
}

子のClassメソッドで、親LoadData()の変数を設定して関数を呼び出せるようにしたいと思います。CurrentRowMyMethod()

どうすればよいですか?

4

4 に答える 4

72

親クラスのプロパティとメソッドにアクセスするには、baseキーワードを使用します。したがって、子クラスのLoadData()メソッドでは、次のようにします。

public class Child : Parent 
{
    public void LoadData() 
    {
        base.MyMethod(); // call method of parent class
        base.CurrentRow = 1; // set property of parent class
        // other stuff...
    }
}

MyMethod()親のアクセス修飾子も、少なくともprotected子クラスがアクセスできるように変更する必要があることに注意してください。

于 2012-12-06T12:28:20.750 に答える
10

解決策を見つけました。

親で、ChildClass()の新しいインスタンスを宣言してから、そのクラスのイベントハンドラーを親のローカルメソッドにバインドします

子クラスに、パブリックイベントハンドラーを追加します。

public EventHandler UpdateProgress;

親で、この子クラスの新しいインスタンスを作成してから、ローカルの親イベントをpublic eventhandler子のでバインドします

ChildClass child = new ChildClass();
child.UpdateProgress += this.MyMethod;
child.LoadData(this.MyDataTable);

次にLoadData()、子クラスので私は呼び出すことができます

private LoadData() {
    this.OnMyMethod();
}

どこOnMyMethodにありますか:

public void OnMyMethod()
{
     // has the event handler been assigned?
     if (this.UpdateProgress!= null)
     {
         // raise the event
         this.UpdateProgress(this, new EventArgs());
     }
}

これにより、親クラスでイベントが実行されます

于 2012-12-06T16:42:25.713 に答える
5

SuhendriによるRoryMcCrossanの回答へのコメントをフォローアップする。アクションデリゲートの例を次に示します。

子に追加:

public Action UpdateProgress;  // In place of event handler declaration
                               // declare an Action delegate
.
.
.
private LoadData() {
    this.UpdateProgress();    // call to Action delegate - MyMethod in
                              // parent
}

親に追加:

// The 3 lines in the parent becomes:
ChildClass child = new ChildClass();
child.UpdateProgress = this.MyMethod;  // assigns MyMethod to child delegate
于 2015-08-26T16:40:27.503 に答える
3

これを行う1つの方法は、インスタンスをonconstructionに渡すことParentClassですChildClass

public ChildClass
{
    private ParentClass parent;

    public ChildClass(ParentClass parent)
    {
        this.parent = parent;
    }

    public void LoadData(DateTable dt)
    {
       // do something
       parent.CurrentRow++; // or whatever.
       parent.UpdateProgressBar(); // Call the method
    }
}

親の内部をthis構築するときは、必ずへの参照を渡してください。ChildClass

if(loadData){

     ChildClass childClass = new ChildClass(this); // here

     childClass.LoadData(this.Datatable);

}

警告:これはおそらくクラスを整理するための最良の方法ではありませんが、質問に直接答えます。

編集:コメントで、複数の親クラスが使用したいと述べていますChildClass。これは、次のようなインターフェースの導入により可能になります。

public interface IParentClass
{
    void UpdateProgressBar();
    int CurrentRow{get; set;}
}

ここで、必ず両方の(すべて?)親クラスにそのインターフェイスを実装し、子クラスを次のように変更してください。

public ChildClass
{
    private IParentClass parent;

    public ChildClass(IParentClass parent)
    {
        this.parent = parent;
    }

    public void LoadData(DateTable dt)
    {
       // do something
       parent.CurrentRow++; // or whatever.
       parent.UpdateProgressBar(); // Call the method
    }
}

これで、実装するものはすべてIParentClass、のインスタンスを構築し、そのコンストラクターChildClassに渡すことができます。this

于 2012-12-06T12:34:54.343 に答える