Получение абстрактного класса от реального класса

Так же, как и другое решение, вы можете использовать .reduce в вашем массиве postnummer для определения найденных индексов предмета поиска.

Это вернет два массива, если вы введете 9900. Если вы сделаете это, вы получите индексы для первого массива и индекс 9900 в нем. В дополнение к этому вы также получите индекс второго массива и индекс, где находится 9900.

См. Рабочий пример ниже:

const postnumber = [[9900, 'Town 1'],[9900, 'Town 2'],[9940, 'Town 3'], [9970, 'Town 4'], [9981, 'Town 5']],

  search = '9900', /* 9900 (int) also works due to '==' in .reduce (not strictly testing the value) */
  res = postnumber.reduce((acc, [num, town], i) => {
    if (num == search) return [...acc, [i, 0]];
    if (town == search) return [...acc, [i, 1]];
    return acc;
  }, []);

console.log(res);

13
задан Marcin 21 November 2008 в 22:34
поделиться

7 ответов

Re Peach от Apple:

  • Не делайте этого, если Apple является классом значений (т.е. имеет копию ctor, не идентична экземпляры могут быть равны и т. д.). Смотри Мейерс Более эффективный C ++, пункт 33, почему.
  • Не делайте этого, если у Apple есть публичный не виртуальный деструктор, иначе ты приглашать неопределенное поведение, когда ваш пользователи удаляют Apple через Указатель на Peach.
  • В противном случае вы, вероятно, в безопасности, потому что вы не нарушили заменяемость Лискова . Peach IS-A Apple.
  • Если вы владеете кодом Apple, предпочитаете выделить общий абстрактный базовый класс (возможно, Fruit) и извлечь из него Apple и Peach.

Re Tomato from Berry:

  • То же как и выше, плюс:
  • Избегайте, потому что это необычно
  • Если необходимо, запишите, что должны делать производные классы Tomato, чтобы не нарушать заменяемость по Лискову. Функция, которую вы переопределяете в Berry - назовем ее Juice () - накладывает определенные требования и дает определенные обещания. Реализации производных классов функции Juice () не должны требовать больше и обещать не меньше. Тогда DerivedTomato IS-A Berry и код, который знает только о Berry, безопасны.

Возможно, последнее требование вы будете выполнять, документируя, что DerivedTomatoes должен вызывать Berry :: Juice () . Если это так, рассмотрите возможность использования вместо этого метода шаблона:

class Tomato : public Berry
{
public:
    void Juice() 
    {
        PrepareJuice();
        Berry::Juice();
    }
    virtual void PrepareJuice() = 0;
};

Теперь есть отличный шанс, что ягода томата IS-A вопреки ботаническим ожиданиям. (Исключение составляют случаи, когда реализации производных классов PrepareJuice накладывают дополнительные предварительные условия, помимо тех, которые налагаются Berry :: Juice ).

8
ответ дан 1 December 2019 в 23:32
поделиться

Это казалось бы мне как признак плохого дизайна. Мог быть вызван, если бы Вы хотели взять конкретное определение из закрытой библиотеки и расширить его и ответвление набор материала от него, но в той точке я буду серьезно рассматривать инструкцию относительно Инкапсуляции по Наследованию.. Если возможно можно инкапсулировать, Вы, вероятно, должны.

Да, больше я думаю об этом, это - Очень Плохая Идея.

5
ответ дан 1 December 2019 в 23:32
поделиться

Не обязательно неправильно, но определенно вонючий. Особенно, если Вы пропускаете фрукты на солнце слишком долго. (И я не думаю, что мой дантист хотел бы меня едящий конкретные яблоки.)

Хотя, главное я вижу здесь, это является вонючим, не так абстрактный класс, полученный из реального класса, но ДЕЙСТВИТЕЛЬНО ГЛУБОКОЙ иерархии наследования.

Править: перечитывание я вижу, что это две иерархии. Весь фруктовый материал перепутал меня.

2
ответ дан 1 December 2019 в 23:32
поделиться

Если вы используете рекомендованную практику наличия модели наследования "is-a", то этот шаблон почти никогда не появится

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

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

Здесь я обычно советую сдерживание, но это даже не кажется хорошей моделью, так как в Apple нет персика.

В этом случае, Я бы выделил общий интерфейс - PieFilling или DessertItem.

2
ответ дан 1 December 2019 в 23:32
поделиться

немного необычно, но если у вас был какой-то другой подкласс базового класса и подклассов абстрактного класса было достаточно общие вещи, чтобы оправдать существование абстрактного класса, например:

class Concrete
{
public:
    virtual void eat() {}
};
class Sub::public Concrete { // some concrete subclass
    virtual void eat() {}
};
class Abstract:public Concrete // abstract subclass
{
public:
    virtual void eat()=0;
    // and some stuff common to Sub1 and Sub2
};
class Sub1:public Abstract {
    void eat() {}
};
class Sub2:public Abstract {
    void eat() {}
};
int main() {
    Concrete *sub1=new Sub1(),*sub2=new Sub2();
    sub1->eat();
    sub2->eat();
    return 0;
}
1
ответ дан 1 December 2019 в 23:32
поделиться

Хм... путем размышления "какого....." в течение нескольких секунд, я прихожу к выводу, что это не распространено... Кроме того, я не получил бы Персик из Apple и Помидор от Ягоды... у Вас есть какой-либо лучший пример?:)

Это - много странного дерьма, которое можно сделать в C++... Я не могу даже думать о 1% о нем...

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

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

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

0
ответ дан 1 December 2019 в 23:32
поделиться

Для ответа на первый вопрос можно сделать это, так как пользователи Apple, если приведено конкретный пример, полученный из Персика, не будут знать несколько отличающийся. И экземпляр не будет знать не Apple (если не будут некоторые виртуальные функции от Apple, которые переопределяются, что Вы не сказали нам о).

Я еще не могу вообразить, как полезный это должно было бы переопределить виртуальную функцию с чистым виртуальным одно - который даже законен?

В целом Вы хотите соответствовать Scott Meyers, "Делают весь нелистовой объект" краткого обзора классов из его книг.

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

0
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: