好的,我认为这是非常基本的东西。
我只熟悉C#和面向对象的语言。
所以这是我正在开发的一个基本项目:
namespace MyProject
{
class MyProject
{
public Logger Logs = new Logger();
public WebServer Web = new WebServer();
static void Main()
{
// blabla
}
}
}
记录器只是创建一个日志文件,当调用其“Add(string str)”方法时,它会在日志文件中添加一行。 网络服务器是我自己的网络服务器,打开套接字等...... 我希望我的网络服务器能够使用记录器的Add方法......我应该如何实现呢?
在我的webserver类中,使用类似“MyProject.Logs.Add(string str)”的东西似乎不起作用。 那我怎么能参考呢? 我不想在我的网络服务器中创建我的Logger类的新实例,因为我想在同一个文本文件中编写每个实例(我可能运行的模块多于网络服务器)。 所以我想使用我在Main方法中创建的实例,在我的Webserver类中...
我希望这是有道理的......
答案 0 :(得分:4)
一些建议:
Logs
和Web
应该是私密的。这些是您班级的实施细节。他们是别人的事。将记录器的实例传递给您的Web服务器:
public WebServer Web = new WebServer(Logs);
您的网络服务器现在可以拥有自己的副本:
private Logger Logs {get;set;}
public WebServer(Logger logs)
{
Logs = logs;
}
public void DoSomething()
{
Logs.Add("I did something!");
}
答案 1 :(得分:4)
MyProject.Logs.Add(string str)
不起作用,因为Logs
成员不是静态的,这意味着它对于类的不同实例(由运算符new
创建)可能不同。如果您没有指定,则编译器无法知道您引用的实例。
如果您将Logs
标记为static
,那么它将有效。
但是,将其设置为静态会使您的项目更少可自定义(例如,您将无法在同一程序中启动两个具有两个不同日志文件的Web服务器)。这就是 John Saunders 建议通常被认为更好的原因。
答案 2 :(得分:1)
您可以通过将Logger
实例内的MyProject
实例的引用传递给WebServer
的实例来轻松完成此操作。
在WebServer
类中,您可以创建类型为Logger
的属性(getter / setter),以便WebServer知道您要使用的Logger。另一种替代方法(可能更好)是将参数添加到采用Logger的WebServer的构造函数中。用于添加属性的伪代码:
public class WebServer
{
public WebServer(Logger l)
{
Log = l;
}
//relevant code....
public Logger Log { get; set; } //Short hand property declaration, see http://msdn.microsoft.com/en-us/library/bb384054.aspx
}
从WebServer
类内部,您可以使用Logger.Add("some text...");
之类的记录器
然后,在Main
方法中,您可以像这样传递Logger
的实例:
namespace MyProject
{
class MyProject
{
public static Logger Logs = new Logger();
public static WebServer Web;
static void Main()
{
Web = new WebServer(Logs);
}
}
}