从另一个类使用类方法

问题描述:

我想从另一个类的类内部使用方法。从另一个类使用类方法

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()。但它不允许我,因为如果我把它公开,那么我看不到它,如果它是静态的,那么它不能与我的列表框交互。

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

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

如果你不明白告诉我,我会尝试更加清晰

+0

基本的想法是让我的方法在不同的命名空间,如“Crystal.Utilities”和实用程序名称空间中,有一个类Logging。日志记录有Log方法,我希望能够从Crystal命名空间中的任何地方进行调用。日志将字符串写入文件,并将一个项目添加到mainform中的listBox。 AM我能做到这一点吗?或者这完全是一个愚蠢的想法?非常感谢您的帮助! – 2010-09-22 21:14:03

+0

是的,这是一个好主意,问题在于你在日志实用程序和窗口之间创建的耦合,我建议你从窗口中提取一个接口,并向记录器添加一个方法,将该接口作为参数,接口将有一个称为写入日志的方法,并将获取一个字符串参数作为消息,窗口将实现此接口,并在构造函数中将自己注册为日志util。 – 2010-09-22 21:25:12

+0

你能给我一些片段吗?自从Iam刚入门C#以来,我不了解所有的事情,你说的。 – 2010-09-22 21:31:34

而是其实现为静态方法,试图实现一个单例。在范围内创建一个全局实例并限制为一个实例,而不将所有内容都设置为静态(因此无法用作实例)是常见的技巧。

+0

感谢您的提示,但单身人士看起来有点复杂:O 无论如何,感谢您的支持,稍后我会看看这个东西。 – 2010-09-22 20:58:42

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

+0

感谢您的信息,评论家。 Iam会再次想到这一点。 – 2010-09-22 21:08:08

+0

让你觉得必须是一件好事( - : – 2010-09-22 21:09:32

这是一种错误的方法。您的课程不应该调用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; } 
} 
+0

我想你想念我,我会试图将某些东西记录到日志文件中,并同时将它打印在我的GUI屏幕上。问题是我无法添加项目从我的Logging类到我的列表框 如果我是一个谁不了解你,那么Iam对不起 – 2010-09-22 21:41:44

+0

非常感谢你的片段,无论如何! – 2010-09-23 10:10:11

+1

@Dominik,日志类*不应该调用你的UI * 。这个UI可能明天就会消失,完全可以用棉球和fingerpaint重新实现,你的日志类应该不受任何这种变化的影响,这就是事件模型的作用,日志类可以提供一个钩子,说“这可能很重要,如果你关心,订阅。“然后用户界面可以说,”我在乎!我在订阅。“ – 2010-09-23 15:30:55