2016-12-14 112 views
0

我有2個類,其中1個類是主類,我有一個從主類實例化的輔助類。我如何能夠使用中學班的主班級方法。這裏的代碼給出了我想要的插圖。C#如何從另一個類實例化一個類的方法?

public class MainClass 
{ 
    private SecondaryClass secondaryClass; 
    private int testValue; 

    public MainClass() 
    { 
     this.secondaryClass = new SecondaryClass(); 
     testValue = 0; 
    } 

    public void updateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public Class SecondaryClass : Form 
{ 
    public SecondaryClass() 
    { 

    } 

    private void button1_click(Object sender, EventArgs e) 
    { 
     // I want to be able to do this: 
     primaryClass.updateTestValue(100); 
    } 

}

回答

3

你可以讓班上學生交流,而無需一個從另一個派生。

public class MainClass 
{ 
    private SecondaryClass secondaryClass; 
    private int testValue; 

    public MainClass() 
    { 
     this.secondaryClass = new SecondaryClass(this.UpdateTestValue); 
     testValue = 0; 
    } 

    public void UpdateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public class SecondaryClass : Form 
{ 
    private Action<int> UpdateValue { get; } 

    public SecondaryClass(Action<int> updateValue) 
    { 
     this.UpdateValue = updateValue; 
    } 

    private void button1_click(Object sender, EventArgs e) 
    { 
     this.UpdateTestValue(100); 
    } 
} 

在這個組織中,主類在創建次級類時將委託傳遞給它自己的實例級方法。次要類調用在適當的時候進行委託,而不知道它是什麼功能。

這是回調模式的例子。

還有其他同一想法的變體。例如,主類可以實現一個定義UpdateValue方法的接口。然後,它將this引用傳遞給需要訪問該方法的每個對象。其他對象,如次級對象,只需調用該接口的方法,再次不知道它實際上是它們引用的主類。

public interface IListener 
{ 
    void Update(int value); 
} 

public class MainClass : IListener 
{ 
    private SecondaryClass secondaryClass; 
    private int testValue; 

    public MainClass() 
    { 
     this.secondaryClass = new SecondaryClass(this); 
     testValue = 0; 
    } 

    public void Update(int val) 
    { 
     testValue = val; 
    } 
} 

public class SecondaryClass : Form 
{ 
    private IListener Listener { get; } 

    public SecondaryClass(IListener listener) 
    { 
     this.Listener = listener; 
    } 

    private void button1_click(Object sender, EventArgs e) 
    { 
     this.Listener.Update(100); 
    } 
} 

這個解決方案的價格是在系統(界面IListener)一個額外的類型,而好處是,你可以避免與委託語法工作。代表有一個缺點,即它們的參數沒有名字,因此如果混合使用,您可以輕鬆地創建一個錯誤。

+0

我怎麼能夠將多個動作傳遞給類? –

+0

您可以通過構造具有多個參數的SecondaryClass並將它們從PrimaryClass中傳遞給它們來傳遞它們 – JARRRRG

+0

我已經基於接口添加了第二個解決方案。這個接口可以暴露多個方法,然後輔助類只有一個參數。這足以讓它在需要時調用任何需要的方法。 –

0
public class MainClass: Form 
{ 
    private int testValue; 

    public MainClass() 
    { 
     testValue = 0; 
    } 

    public void updateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public class SecondaryClass : MainClass 
{ 
    public SecondaryClass() 
    { 

    } 

    private void button1_click(Object sender, EventArgs e) 
    { 
     // I want to be able to do this: 
     updateTestValue(100); 
    } 
} 
0

一個類只能有一個基類

你可以做的是移動:表單基類到主類,然後從您的輔助類將它的基類作爲Primary類並使用如下函數。

public class PrimaryClass : Form 
{ 
    private int testValue; 

    public void PrimaryClassMethod() 
    { 
     Console.WriteLine("Method from Primary Class"); 
    } 

    public void UpdateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public class SecondaryClass : PrimaryClass 
{ 
    public void CallPrimaryClassMethod() 
    { 
     this.PrimaryClassMethod(); 
     this.UpdateTestValue(10000); 
    } 

} 

https://dotnetfiddle.net/PC2WVu

相關問題