我有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);
}
}
答案 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);
}
}