#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. Если идентификатор должен быть уникальным, я бы сказал, что определенно не позволяйте пользователям устанавливать это вручную.