Правильно создать класс с подклассами (C#) - PullRequest
0 голосов
/ 02 мая 2020

Я создаю программу на C#, и я не знаю, как создавать свои классы. Вот как выглядит мой класс:

public class MyClass
{
    public class Parameters
    {
        string Value { get; set;}
    }

    public class Methods
    {
        public void MyMethod()
        {
            Window.Title = Parameters.Value;
        }
    }
}

И вот как я хочу использовать его из другого класса:

public class MainClass
{
    MyClass myclass = new MyClass();
    myclass.Parameters.Value = "Hello World !";
    myclass.Methods.MyMethod();

    System.Threading.Thread.Sleep(Timespan.FromSeconds(10));

    MyClass myclass2 = new MyClass();
    myclass2.Parameters.Value = "Hello World Again !";
    myclass2.Methods.MyMethod();

    //I know this code is stupid, it's just to simplify my example.
}

Но это не работает, есть проблемы доступности, которые я не знаю, как решить.

Заранее спасибо, я не думаю, что решение очень сложное, но я не могу его найти.

Ответы [ 3 ]

1 голос
/ 02 мая 2020
  1. Вам необходимо задать свойство Value public, чтобы получить или установить его вне класса:
public string Value { get; set; }
Классы не static, поэтому вам нужно создать их экземпляры, чтобы установить их свойства или использовать их методы:
var parameters = new MyClass.Parameters();
parameters.Value = "Hello World !";
var methods = new MyClass.Methods();
methods.MyMethod();
То же самое относится и здесь:
public void MyMethod()
{
    var parameters = new MyClass.Parameters();
    Window.Title = parameters.Value;
}
Но я подозреваю, что вы действительно хотите, чтобы у MyClass были свои экземпляры этих классов. Таким образом, вы можете добавить свойства для них:
public Properties Properties { get; set; }

public Methods Methods { get; set; }
Затем создайте их как-нибудь (как в конструкторе):
public MyClass()
{
    Parameters = new Parameters();
    Methods = new Methods();
}

Если вы выполните шаги 1, 4 и 5, ваш код в MainClass должен работать.

0 голосов
/ 02 мая 2020

Создайте конструктор, который заставит пользователя добавить значение при инициализации класса

public class MyClass
{
    public string Value { get; set; }
    public MyClass(string value)
    {
        Value = value;
    }


    public class Methods
    {
        public void MyMethod()
        {
            Window.Title = Value;
        }
    }
}

и вызвать его так:

   MyClass myclass = new MyClass("Hello World !");
    myclass.Methods.MyMethod();

    System.Threading.Thread.Sleep(Timespan.FromSeconds(10));

    MyClass myclass2 = new MyClass("Hello World Again !");
    myclass2.Methods.MyMethod();
0 голосов
/ 02 мая 2020

Вы можете объявить свойства и методы в пределах класса:

public class MyClass
{

   public MyClass() 
   {
     // Set any initial values
   }

   public string Value { get; set;}
   public void MyMethod()
   {
      Window.Title = Value;
   }
}

И затем использовать его:

public class MainClass
{
    MyClass myclass = new MyClass();
    myclass.Value = "Hello World !";
    myclass.MyMethod();

    System.Threading.Thread.Sleep(Timespan.FromSeconds(10));

    MyClass myclass2 = new MyClass();
    myclass2.Value = "Hello World Again !";
    myclass2.MyMethod();
}

Или быть более кратким:

public class MainClass
{
    MyClass myclass = new MyClass {
       Value = "Hello World !"
    };
    myclass.MyMethod();

    System.Threading.Thread.Sleep(Timespan.FromSeconds(10));

    MyClass myclass2 = new MyClass {
       Value = "Hello World Again !"
    };
    myclass2.MyMethod();
}

ОБНОВЛЕНИЕ

Если вам абсолютно необходимо разделить классы (хотя я бы не рекомендовал это), то вам нужно передать свое значение в класс метода, чтобы использовать его. Есть пара подходов. Либо вы должны передать значение в ваш класс методов (не очень элегантный подход):

public class MyClass
{
   public string Value { get; set;}

   public Methods methods {get; set;)

   public MyClass(string value) 
   {
     methods = new Methods(value);
     Value = value;
   }

   public class Methods 
   {
     public string Value { get; set;}

     public Methods(string value) 
     {
       Value=value;
     }

    public void MyMethod() 
    {
       Window.Title = Value;
    }
   }
}

Или сделать MyMethod () методом stati c и передать значение для использования:

public class MyClass
{
   public string Value { get; set;}

   public MyClass(string value) 
   {
     methods = new Methods(value);
     Value = value;
   }
}

public static class Methods 
{
  public static void MyMethod(string Value) 
  {
       Window.Title = Value;
  }
}
public class MainClass
{
    MyClass myclass = new MyClass {
       Value = "Hello World !"
    };
    Methods.MyMethod(myclass.Value);

    System.Threading.Thread.Sleep(Timespan.FromSeconds(10));

    MyClass myclass2 = new MyClass {
       Value = "Hello World Again !"
    };
    Methods.MyMethod(myclass2.Value);
}

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

...