使用另一个类的类方法

时间:2010-09-22 20:41:52

标签: c# class public-method

我正在尝试在类中使用另一个类的方法。

namespace Crystal.Utilities
{
   public class Logging
   {
      public static void Log()
      {
          //dostuff
          Crystal.MainForm.general_log_add_item("Hello World");
      }
   }
}

namespace Crystal
{
   public partial class MainForm : Form
   { 
      public void general_log_add_item(string msg)
      {
         listBox1.Items.Add(msg);
      }
   }
} 

我希望能够从任何地方调用Crystal.Utilities.Logging.Log(),并且能够调用Crystal.MainForm.general_log_add_item()。但它不会让我,因为如果我把它公之于众,那么我就看不到它,如果它是静态的那么它就无法与我的列表框进行交互。

4 个答案:

答案 0 :(得分:4)

这是一种错误的做法。您的类不应调用UI,因为UI可能会更改。该课程不应该知道也不关心UI。相反,该类可以公开表单可以订阅的事件,并根据事件参数中包含的信息进行更新。

这是一个匆忙抛出的例子。

class Program
{
    static void Main()
    {
        Logger.OnLogging += Logger_OnLogging;
        Logger.Log();
        Logger.OnLogging -= Logger_OnLogging;
    }

    static void Logger_OnLogging(LoggingEventArgs e)
    {
        Trace.WriteLine(e.Message);
    }
}

public class Logger
{
    public delegate void LoggingEventHandler(LoggingEventArgs e);

    public static event LoggingEventHandler OnLogging;

    public static void Log()
    {
        // do stuff
        RaiseLoggingEvent("Data logged");
    }

    protected static void RaiseLoggingEvent(string message)
    {
        if (OnLogging != null)
            OnLogging(new LoggingEventArgs(message));
    }
}

public class LoggingEventArgs : EventArgs
{
    public LoggingEventArgs(string message)
    {
        this.Message = message;
    }

    public string Message { get; private set; }
}

答案 1 :(得分:3)

不要将其作为静态方法实现,而是尝试以单例形式实现。这是一个常见的技巧,可以使实例在范围内全局化,并限制为一个实例,而不会使所有内容都静态(因此无法用作实例)。

答案 2 :(得分:2)

你必须明白窗口不是静态的,有一个他的实例,这就是为什么这个方法不能是静态的, 您可以使用 Application.Windows到达此实例并调用add方法。

或者你可以在他的构造函数中注册另一个将调解Logging和窗口的类。

如果你不明白告诉我,我会试着更清楚

答案 3 :(得分:2)

当您将方法声明为“静态”时,您说它不依赖于它所在类的特定实例。
例如,如果您有一个名为“chair”的类,并且您想要计算有多少个椅子,那么您将使用静态字段和静态方法来返回该字段的值。
所有椅子的数量与特定椅子无关 在您的情况下,您想要添加静态方法以将项添加到窗体的特定实例。这是不可能的,也没有意义 如果要将项添加到listBox,则必须通过公共方法 所以基本上我所说的是 - 重新思考你正在尝试做什么,有一个很好的解释,为什么你没有成功这样做。