2013-09-28 5 views
1

На работе я контролирую очень большой список серверов и веб-сайтов, связанных с приложением, запущенным на серверах. Как правило, каждое приложение имеет кластер серверов за ним и примерно 6-10 различных веб-страниц. Так что я сделал, так это то, что я создал класс Servers, который будет использовать имена серверов и управлять URL-адресами, связанными с ним. Теперь вот часть, с которой я борюсь. Каждый URL-адрес будет иметь два значения, связанные с ним: физический url и статус URL-адреса (онлайн/офлайн). Я придумал два способа справиться с этим: либо я создаю 2D-массив (или список), либо создаю подкласс url. Метод подкласса казался лучше, так как я думал, что доступ ко всем методам подкласса будет легким ... Ну, сейчас я не могу назвать их вообще вне класса Servers. Это заставляет меня думать, что у меня проблема с областью классов/методов. Вот мой код Servers.cs ... Что я делаю неправильно?Неверный охват моих вложенных классов?

public class Server 
{ 
    public List<string> serverNames = new List<string>(); 
    public List<object> urlList = new List<object>(); 
    public string[][] urlArr = new string[1][]; 

    public Server() 
    { 

    } 

    public Server(string nm) 
    { 
     serverNames.Add(nm); 
    } 

    public void setName(string newName) 
    { 
     serverNames.Add(newName); 
    } 

    public void addUrl(string newUrl) 
    { 
     Server.Url url = new Server.Url(newUrl); 
     urlList.Add(url); 
     url.SetStatus(false); 
    } 

    protected class Url 
    { 
     public string url; 
     public bool status; 

     public Url() 
     { 
     } 

     public Url(string URL) 
     { 
      url = URL; 
     } 

     public void SetStatus(bool stat) 
     { 
      status = stat; 
     } 

     public bool ReturnStatus() 
     { 
      return status; 
     } 
    } 
} 

Вот как я пытаюсь вызвать метод Url класса ReturnStatus, чтобы увидеть статус этого URL-адреса. Проблема заключается в том, что метод ReturnStatus не доступен ...

private void button2_Click(object sender, EventArgs e) 
{ 
    int length = serversList[0].urlList.Count; 

    for (int i = 0; i <= length - 1; i++) 
    { 
     listBox1.Items.Add(serversList[0].urlList[i].ToString()+        serversList[0].urlList[i].ReturnStatus()); 
    } 
} 
+1

Сделать 'Url' классом' public', если вы хотите называть его извне? – millimoose

+0

Непонятно, в чем проблема, вы никогда не используете 'Server.Url' из всего, что можно было бы назвать« вне класса «Server» в вашем примере кода. Можете ли вы показать какой-то код, который вы хотите работать, сломаны и ошибки, которые вы получаете? – millimoose

+0

Кроме того, вы можете использовать свойства C# вместо методов, таких как 'SetStatus()' и 'ReturnStatus()'. Если ничто другое не является идиоматическим подходом. Также делает ли 'urlArr' что-нибудь? – millimoose

ответ

2

Создание Url класса, безусловно, правильный шаг здесь. Это позволяет вам гибкость и потенциал роста, если вам нужно хранить в нем больше информации (возможно, LastGoodStatusTime или некоторые другие данные отчетности). Однако похоже, что вы, вероятно, не хотите, чтобы это был внутренний класс. Просто сделайте это своим классом, тогда каждый сможет получить к нему доступ.

Кроме того, в качестве одного из упомянутых замечаний, Status в классе Url будет лучше сделана как собственность.

public class Server 
{ 
    public List<string> serverNames = new List<string>(); 
    public List<object> urlList = new List<object>(); 
    public string[][] urlArr = new string[1][]; 

    public Server() 
    { 

    } 

    public Server(string nm) 
    { 
     serverNames.Add(nm); 
    } 

    public void setName(string newName) 
    { 
     serverNames.Add(newName); 
    } 

    public void addUrl(string newUrl) 
    { 
     Server.Url url = new Server.Url(newUrl); 
     urlList.Add(url); 
     url.SetStatus(false); 
    } 
} 

public class Url 
{ 
    public string url; 
    public bool Status { get; set; } 

    public Url() 
    { 
    } 

    public Url(string URL) 
    { 
     url = URL; 
    } 
} 

Обратите внимание, что если вы сильно желаете, чтобы идти по пути сохранения Url внутренний класс, вам необходимо:

  • Сделать public
  • Обратитесь к Url внешних классов, Server.Url , как в var myUrl = new Server.Url("http://stackoverflow.com/");
+0

Идея иметь его в качестве подкласса заключалась в том, чтобы связать объекты сервера и URL-адреса. Я мог бы попробовать создать внешний класс, так как это кажется проще .. Спасибо за совет. –

+0

То, что я закончил, было разделение двух классов. Затем, когда я создаю новый объект Server, я также создаю новый объект Url и помещаю их в 2D-массив. Таким образом, должно быть легко ссылаться на соответствующие серверы/URL-адреса. –

Смежные вопросы