Дополнительные открытые методы в производных классах?

Все они могут рассматриваться как одно и то же, на самом деле зависит от контекста. Хотя процесс обычно является изолированным объектом, управляемым операционной системой. Работа - это скорее термин уровня приложения или просто какой-то сценарий, который выполняется для выполнения определенного набора задач. Задача часто является частью работы - иногда единственной частью.

6
задан wattostudios 30 April 2012 в 14:16
поделиться

8 ответов

Лично я не вижу проблем ни с тем, ни с другим.

Что касается дополнительных общедоступных методов в производных классах:

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

Что касается сигнатур конструкторов -

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

При этом:

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

d избегать наличия конструктора подкласса с меньшим количеством параметров, чем у базового класса ... почему я могу указывать что-то в более общем случае, а не в конкретном случае? Я считаю, что обычно сбивает с толку, когда подклассы имеют совершенно разные варианты построения, чем их базовые классы.

d избегать наличия конструктора подкласса с меньшим количеством параметров, чем у базового класса ... почему я могу указывать что-то в более общем случае, а не в конкретном случае? Я считаю, что обычно сбивает с толку, когда подклассы имеют совершенно разные варианты построения, чем их базовые классы.

5
ответ дан 9 December 2019 в 20:48
поделиться

В этом прелесть производных классов.

Хотя класс Pen может иметь функцию write (), класс RetractablePen, расширяющий Pen, также может иметь функцию retractPoint ().

Когда вы расширяете класс, это означает - буквально - расширение его функциональности.

2
ответ дан 9 December 2019 в 20:48
поделиться

Да, мы действительно используем его на Chess.com и в целом очень им довольны. Может возникнуть проблема с попыткой выяснить, как / где хранить все эти QFormStates, когда вы получаете более миллиона просмотров страниц в день. Каждое представление страницы - это собственный QFormState! Мы решили это, поместив их все в кэш памяти! У него действительно есть некоторая кривая обучения, но как только вы это узнаете, вам больше не понадобится документация. На самом деле я полностью отказался от использования QQ и использую все пользовательские sql в наших файлах ORM. QQ просто недостаточно мощен, чтобы выполнять сильно оптимизированные запросы, а точно настроенные запросы более важны, чем абстракция базы данных. В конце концов, сайт должен работать и быть быстрым. Вот один пример статического метода ORM в нашем классе User для загрузки случайного пользователя из базы данных (мы использовали его для отображения случайного "

1
ответ дан 9 December 2019 в 20:48
поделиться

В целом это нормально.

Чего вы хотите избежать, так это использования специфического в общем. т.е.

foreach(Animal a in myFarm.Animals)
{
    a.Feed();
    // this is a bit grim
    if( a is Horse )
    {
       ((Horse)a).CleanStable();
    }
}

Так что это не добавление общедоступных методов, а то, откуда вы их вызываете.

2
ответ дан 9 December 2019 в 20:48
поделиться

Нет, вполне разумно (а иногда и очень необходимо по замыслу) добавлять дополнительные общедоступные методы. Рассмотрим (полностью надуманную) ситуацию абстрактного базового класса Shape , который имеет член Location и метод Size . Например, когда вы производите Polygon из Shape , вы можете добавить общедоступный метод с именем GetNumberOfSides () ; но вы не хотите, чтобы это было, когда вы производите Circle из Shape .

Таким же образом производные типы могут иметь очень разные требования к построению; На самом деле невозможно знать, какие могут быть все требования при определении абстрактного базового класса, поэтому не стесняйтесь иметь разные подписи. Тот факт, что ваши dervied-типы будут полиморфными абстрактному базовому классу, не означает, что этот базовый класс налагает строгие ограничения на то, как вы можете реализовать абстракции, определенные в этом базовом классе; вы можете делать это, как хотите.

1
ответ дан 9 December 2019 в 20:48
поделиться

производные классы не должны предоставлять дополнительные общедоступные методы

Может ли собака делать то, что не может сделать животное?

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

Здесь нет никаких проблем. Производные типы не обязаны соответствовать сигнатурам конструктора своих братьев и сестер или родителей.

0
ответ дан 9 December 2019 в 20:48
поделиться

Это не только приемлемо, но часто бывает необходимо, чтобы конструкторы были разными. Например, если у нас есть (неизменяемый) класс Rectangle и мы расширяем его с помощью (неизменяемого) Square , конструктор Square должен быть (для использования Java на данный момент)

public Square(double size)

, в то время как конструктор Rectangle будет

public Rectangle(double width, double height)

Что действительно должно произойти, так это то, что конструктор подкласса должен вызвать некоторый соответствующий конструктор суперкласса.

Что касается дополнительных общедоступных методов, это может зависеть от использования. Для случая Square я бы не стал добавлять никаких дополнительных методов. Однако в Java есть подкласс PrintWriter из Writer чья цель - добавить некоторые удобные методы. В этом случае я думаю, что это нормально (в Java конечно есть несколько плохих примеров, но я не думаю, что это один из них). Я также ожидал бы возможности некоторых дополнительных методов для типов контейнеров / подчастей.

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

0
ответ дан 9 December 2019 в 20:48
поделиться

Если вы соблюдаете принцип замены Лисков , вы можете делать все, что хотите.

Конечно, добавление метода к производному классу нисколько не нарушает принципа.

1
ответ дан 9 December 2019 в 20:48
поделиться