Так же, как и другое решение, вы можете использовать .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);
Re Peach от Apple:
Re Tomato from 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
).
Это казалось бы мне как признак плохого дизайна. Мог быть вызван, если бы Вы хотели взять конкретное определение из закрытой библиотеки и расширить его и ответвление набор материала от него, но в той точке я буду серьезно рассматривать инструкцию относительно Инкапсуляции по Наследованию.. Если возможно можно инкапсулировать, Вы, вероятно, должны.
Да, больше я думаю об этом, это - Очень Плохая Идея.
Не обязательно неправильно, но определенно вонючий. Особенно, если Вы пропускаете фрукты на солнце слишком долго. (И я не думаю, что мой дантист хотел бы меня едящий конкретные яблоки.)
Хотя, главное я вижу здесь, это является вонючим, не так абстрактный класс, полученный из реального класса, но ДЕЙСТВИТЕЛЬНО ГЛУБОКОЙ иерархии наследования.
Править: перечитывание я вижу, что это две иерархии. Весь фруктовый материал перепутал меня.
Если вы используете рекомендованную практику наличия модели наследования "is-a", то этот шаблон почти никогда не появится
Когда у вас есть конкретный класс, вы говорите, что вы можете создать его экземпляр. Если вы потом выводите из него абстрактный класс, то что-то, что является атрибутом базового класса, не относится к производному классу, который должен устанавливать клаксоны, что что-то не так.
Если смотреть на ваш пример, персик не яблоко, поэтому оно не должно быть производным от него. То же самое верно и для томатов, полученных от Берри.
Здесь я обычно советую сдерживание, но это даже не кажется хорошей моделью, так как в Apple нет персика.
В этом случае, Я бы выделил общий интерфейс - PieFilling или DessertItem.
немного необычно, но если у вас был какой-то другой подкласс базового класса и подклассов абстрактного класса было достаточно общие вещи, чтобы оправдать существование абстрактного класса, например:
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;
}
Хм... путем размышления "какого....." в течение нескольких секунд, я прихожу к выводу, что это не распространено... Кроме того, я не получил бы Персик из Apple и Помидор от Ягоды... у Вас есть какой-либо лучший пример?:)
Это - много странного дерьма, которое можно сделать в C++... Я не могу даже думать о 1% о нем...
О переопределении виртуальное с чистым виртуальным можно, вероятно, просто скрыть его, и это будет действительно странно...
Если бы можно найти глупый компилятор C++, который связал бы эту функцию как виртуальное, то Вы получите чистый вызов виртуальной функции во время выполнения...
Я думаю, что это может только быть сделано для взлома, и я понятия не имею какой взлом действительно...
Для ответа на первый вопрос можно сделать это, так как пользователи Apple, если приведено конкретный пример, полученный из Персика, не будут знать несколько отличающийся. И экземпляр не будет знать не Apple (если не будут некоторые виртуальные функции от Apple, которые переопределяются, что Вы не сказали нам о).
Я еще не могу вообразить, как полезный это должно было бы переопределить виртуальную функцию с чистым виртуальным одно - который даже законен?
В целом Вы хотите соответствовать Scott Meyers, "Делают весь нелистовой объект" краткого обзора классов из его книг.
Так или иначе, кроме того, что то, что Вы описываете, кажется, законно - его просто, что я не вижу, что Вам нужен он настолько часто.