C#如何从它实例化的另一个类访问类的方法?

时间:2016-12-14 22:57:28

标签: c# class oop methods

我有2个类,其中1个类就像主类一样,我有一个从主类实例化的辅助类。我如何能够使用辅助类中的主类方法。这是代码,用于说明我想要的内容。

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 个答案:

答案 0 :(得分: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),其好处是您可以避免使用委托语法。代表们有一个缺点,即他们的论点没有名字,因此如果你把它们搞混,你就可以很容易地犯错。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

一个类只能有一个基类

你可以做的是将:Form基类移动到主类,然后从你的辅助类将它的基类作为主类,并使用如下函数。

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