базовая архитектура C # и вопрос обработки классов - PullRequest
1 голос
/ 19 июня 2010

Ладно, ребята, это очень простые вещи, я думаю.

Я только знакомлюсь с C # и объектно-ориентированными языками.

Итак, вот основной проект, который я разрабатываю:

namespace MyProject  
{  
    class MyProject  
    {
        public Logger Logs = new Logger();
        public WebServer Web = new WebServer();

        static void Main()
        {  
            // blabla
        }  
    }  
}

Регистратор предназначен для простого создания файла журнала, и когда вызывается его метод «Add (string str)», он добавляет строку в файл журнала.Веб-сервер - это мой собственный веб-сервер, открывающий сокет и т. Д. Я хотел бы, чтобы мой веб-сервер мог использовать мой метод добавления в регистраторе ... как мне этого добиться?

Внутри моегоКласс веб-сервера, использующий что-то вроде «MyProject.Logs.Add (string str)», похоже, не работает.Так как я могу ссылаться на это?Я не хочу создавать новый экземпляр моего класса Logger внутри моего веб-сервера, потому что я хочу записывать все в один и тот же текстовый файл (у меня может быть запущено больше модулей, чем просто веб-сервер).Поэтому я хотел бы использовать экземпляр, который я создал в своем методе Main, внутри своего класса веб-сервера ...

Надеюсь, это имеет смысл ...

Ответы [ 3 ]

4 голосов
/ 19 июня 2010

MyProject.Logs.Add(string str) не работает, потому что Logs член не является статическим, что означает, что он может отличаться для разных экземпляров вашего класса (которые создаются оператором new).Компилятор не может знать, на какой экземпляр вы ссылаетесь, если вы его не укажете.

Если вы пометите Logs как static, тогда он будет работать.

Однако,статичность делает ваш проект менее настраиваемым (например, вы не сможете запустить два веб-сервера с двумя разными лог-файлами в одной программе).Вот почему то, что Джон Сондерс предложил, обычно считается лучше.

4 голосов
/ 19 июня 2010

Пара предложений:

  1. Logs и Web должны быть приватными. Это детали реализации вашего класса. Они никого не занимаются.
  2. Передайте экземпляр вашего регистратора на ваш веб-сервер:

    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 голос
/ 19 июня 2010

Вы можете легко сделать это, передав ссылку на Logger экземпляр, который вы создали в MyProject, вашему экземпляру WebServer.

В вашем классе WebServer вы можете сделатьсвойство (метод получения / установки) типа Logger, чтобы WebServer знал о Logger, который вы хотите использовать.Другой альтернативой (возможно, лучше) является добавление параметра в конструктор WebServer, который принимает Logger.Псевдокод для добавления свойства:

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);
        }  
    }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...