Как мой дочерний класс может совместно использовать idCounter с материнским классом?

#c# #.net #inheritance #static #counter

#c# #.net #наследование #статический #счетчик

Вопрос:

Я очень новичок в программировании, и я не смог найти точный ответ на свой вопрос, погуглив его, поэтому, надеюсь, я сделаю его максимально простым для понимания.

Мой общедоступный класс MotherClass() имеет общедоступный идентификатор int, который должен показывать текущий номер, хранящийся в общедоступном статическом int idCounter. Я хочу наследовать / совместно использовать тот же idCounter в моем общедоступном классе ChildClass : MotherClass.

Поэтому, когда я создаю, например, 2 новых объекта MotherClass() и, скажем, 2 новых объекта ChildClass(), их идентификаторы должны быть: 1,2,3,4 (общие), а не как 1,2 и 1,2 (разные счетчики для каждого класса).

Это то, что у меня есть:

 public class MotherClass(){
    public static int idCounter {get; set;}
    public int Id { get; set; }
    public string Name { get; set; }

    static MotherClass(){
       idCounter = 1;
    }

   public MotherClass(string name, int id = -1){
   
     if(id == -1)
       Id = idCounter  ;
     Name = name;
   }


public class ChildClass : MotherClass{
   
   public double Price { get; set; }

   public ChildClass(string name, double price int id =-1) : base(name,id){
     
      Price = price;

   }
  

}

Комментарии:

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

2. Если вы действительно хотите быть хорошим программистом, не гуглите. Читайте книги.

3. @jdweng Итак, вы думаете добавить пример общедоступного материнского класса { get; set;} в дочерний класс, верно? Я привел здесь примеры имен классов, в моем случае было бы странно иметь этот родительский класс в свойстве моего дочернего класса. Так что это не было бы моим первым решением для этого, если это возможно. Спасибо за ответ, я буду использовать это, если не появится ничего более подходящего.

4. @RomanRyzhiy У меня нет никаких книг, которые могли бы помочь мне с этой проблемой, поэтому, к сожалению, Google — вариант 1 в этом случае.

5. Вы путаете унаследованные классы и древовидные структуры. Отношения между родителями и дочерними элементами представляют собой древовидную структуру.

Ответ №1:

Вот один из способов, которым вы могли бы это сделать:

 public class MotherClass
{
    public static int IdCounter { get; private set; } = 1;
    public int Id { get; } = IdCounter  ;
}

public class ChildClass : MotherClass { }
  

Каждый раз, когда вы создаете новое MotherClass или ChildClass , IdCounter будет увеличиваться.

Пример:

 Console.WriteLine(new MotherClass().Id); // 1
Console.WriteLine(new MotherClass().Id); // 2
Console.WriteLine(new ChildClass().Id);  // 3
  

Вы должны сделать параметр IdCounter private, тогда другие классы не смогут изменять значение.

Комментарии:

1. Спасибо за ответ! Вопрос: Позже в классе ProgramUI, который в основном является меню для операций с сущностями, я хочу, чтобы у пользователя была возможность добавлять / редактировать эти экземпляры материнского и дочернего классов (идентификаторы тоже). Если я сделаю idCounter частным набором; и Id только get; , как мне изменить этот идентификатор позже? Должен ли я сделать что-то вроде этого: public int Id { get { return IdCounter; } set { IdCounter = value; } }

2. Вы бы просто добавили общедоступные сеттеры, но это, вероятно, не очень хорошая идея. Если для идентификатора задан тот же идентификатор, что и для существующего объекта, вы получите дубликаты.

3. Это правда, но позже я бы создал метод, который проверяет, является ли введенный пользователем идентификатор числом, уже используемым для другого объекта, или нет. Что-то вроде этого, я думаю. По крайней мере, это идея. Хотя, может быть, лучше, если идентификаторы не могут быть изменены пользователями.

4. Если идентификатор должен быть уникальным, я бы сказал, что определенно не позволяйте пользователям устанавливать это вручную.