Родительский класс должен знать свои дочерние классы - PullRequest
1 голос
/ 18 августа 2010

Пробе: Родительский абстрактный класс должен знать обо всех существующих дочерних классах.Родительский класс также должен иметь возможность перечислять все имена классов своих дочерних классов с помощью метода.

Контекст: В моей ситуации родительский класс используется для представления любого типа входных данныхдля веб-формы (такой как электронная почта, текст, логическое значение, целое число, изображение и т. д.).Дочерние классы представляют каждый конкретный тип данных.Итак, есть логический класс, класс Image, класс Integer и т. Д.

Я использую язык C #.

Как бы вы это сделали?

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

Так, например, мне нужно получить экземпляр класса Image просто со строкой «Image», котораяхранится в базе данных.Если базовый класс знает всех своих дочерних элементов, я смогу попросить его указать мне дочерний элемент, представленный строкой «Image», и он вернет экземпляр класса Image.

Я думал о реализацииэто делается путем превращения каждого дочернего элемента в синглтон и добавления его в список дочерних элементов (на этапе создания), который будет частным полем базового класса DataType.

Ответы [ 4 ]

2 голосов
/ 18 августа 2010

Вы можете написать в коде конструктора, который уведомит некоторый статический класс о создании чего-то нового.

Что-то вроде:

class A {
 A() {
  myBuilder.notifyMe(this);
 }
}

myBuilder - статический класс с кодом:

void notifyMe(Object o) {
 // do whatever you want here
 // maybe something like
 someList.Add(typeof(o).Name)
}

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

2 голосов
/ 21 марта 2013

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

Короче говоря, вы должны быть переделаны.Мне нужно больше знать о проблемном контексте, чтобы дать конкретный совет по этому вопросу.

2 голосов
/ 18 августа 2010

Вы можете проверить этот пост.Похоже, вам нужно перебрать известные типы и посмотреть, являются ли они подклассом родительского класса, используя Type.IsSubclassOf

0 голосов
/ 21 августа 2013

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

Простите, потому что я больше не знаком с синтаксисом C #, но это будет примерно так:

public class Control // (could be base class or whatever is needed)
{

}

public class ImageControl extends Control
{

}

public class ControlFactory
{
    public static Control createControl(String control)
    {
        if(control == "IMAGE")
        {
            return new ImageControl();
        }
        // error situation, control was unknown.
    } 
}

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

...