Почему избегают заключительного ключевого слова?

1. Сделайте так, чтобы ваш ярлык поддерживал несколько строк,

textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

2.Установите предполагаемую высоту ячейки

cell.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize

На что обратить внимание:

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

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

11
задан Snukker 6 February 2009 в 11:10
поделиться

10 ответов

Я соглашаюсь с Jon и Kent, но, как Scott Myers (в Эффективном C++), я иду гораздо дальше. Я полагаю, что каждый класс должен быть также abstract, или final. Таким образом, только листовые классы в любой иерархии действительно склонны для прямого инстанцирования. Все другие классы (т.е. внутренние узлы в наследовании) “не закончены” и должны, следовательно, быть abstract.

Просто не имеет никакого смысла для обычных классов быть далее расширенным. Если бы аспект класса стоит расширить и/или изменить, более чистый путь состоял бы в том, чтобы посещать тот один урок и разделить его на один abstract базовый класс и одна конкретная взаимозаменяемая реализация.

11
ответ дан 3 December 2019 в 01:09
поделиться

Существуют, конечно, времена, когда имеет смысл иметь незаключительные реальные классы. Однако я соглашаюсь с Кентом - я полагаю, что классы должны быть окончательными (впаял C#), по умолчанию, и что методы Java должны быть последними по умолчанию (как они находятся в C#).

Как Kent говорит, наследование требует тщательного дизайна и документации - очень легко думать, что можно просто переопределить отдельный метод, но не знать ситуации, в которых тот метод можно назвать от базового класса как часть остальной части реализации.

См., "Как Вы разрабатываете класс для наследования" для большего количества обсуждения этого.

12
ответ дан 3 December 2019 в 01:09
поделиться

Этот вопрос одинаково применим к другим платформам, таким как C#.NET. Существует это (самостоятельно включенный), которые полагают, что типы должны быть окончательными/изолировать по умолчанию и должны быть явно распечатаны для разрешения наследования.

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

5
ответ дан 3 December 2019 в 01:09
поделиться

Вашей лучшей ссылкой здесь является Объект 15 из превосходной книги Joshua Bloch "Эффективный Java", названный "Дизайн и документ для наследования, или иначе запретите его". Однако ключ к тому, должно ли расширение класса быть позволено, не, "это, краткий обзор", но "был разработанным с наследованием в памяти". Между этими двумя иногда существует корреляция, но это является вторым, который важен. Для взятия простого примера, большинство классов AWT разработано, чтобы быть расширенным, даже те, которые не абстрактны.

Сводка главы Bloch - то, что взаимодействие наследованных классов с их родителями может быть удивительным и unpredicatable, если предок не был разработан, чтобы быть наследованным от. Классы должны поэтому прибыть в два вида a) классы, разработанные, чтобы быть расширенными, и с достаточным количеством документации, чтобы описать, как она должна быть сделана, b) классы отметили финал. Классы в (a) часто будут абстрактны, но не всегда. Для

4
ответ дан 3 December 2019 в 01:09
поделиться

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

например, будьте в спящем режиме прокси использования для ленивой выборки ассоциации. особенно когда дело доходит до AOP, Вы захотите свой нефинал классов, так, чтобы перехватчики могли присоединить к нему. см. также вопрос в ТАК

4
ответ дан 3 December 2019 в 01:09
поделиться

Я не согласен. Если бы иерархии были плохи, то не было бы никакой причины объектно-ориентированных языков для существования. При рассмотрении библиотек виджета UI от Microsoft и Sun Вы несомненно найдете наследование. Тот весь "плохой код" по определению? Нет, конечно, нет.

Наследованием можно злоупотребить, но любая функция языка - также. Прием должен изучить, как сделать вещи соответственно.

2
ответ дан 3 December 2019 в 01:09
поделиться

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

3
ответ дан 3 December 2019 в 01:09
поделиться

Я не мог не согласиться больше. Иерархии классов имеют смысл для реальных классов, когда реальные классы знают возможные типы возврата методов, что они не отметили финал. Например, реальный класс может иметь рычаг подкласса:

protected SomeType doSomething() {
return null;
}

Этот doSomething, как гарантируют, будет или пустым указателем или экземпляром SomeType. Скажите, что Вы имеете способность обработать экземпляр SomeType, но не имеете варианта использования для использования экземпляра SomeType в текущем классе, но знаете, что эту функциональность было бы действительно хорошо иметь в подклассах, и большинство все конкретно. Не имеет никакого смысла делать текущий класс абстрактным классом, если это может использоваться непосредственно со значением по умолчанию выполнения ничего с его нулевым значением. Если бы Вы сделали это абстрактным классом, то у Вас были бы его дети в этом типе иерархии:

  • Абстрактный базовый класс
    • Класс по умолчанию (класс, который, возможно, был неабстрактен, только реализует защищенный метод и ничто иное),
    • Другие подклассы.

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

  • Класс по умолчанию
    • Другие подклассы.

Теперь, уверенный, иерархии могут использоваться и злоупотребляться, и если вещи не документируются ясно или классы, не хорошо разработанные, подклассы могут столкнуться с проблемами. Но эти те же проблемы существуют с абстрактными классами также, Вы не избавляетесь от проблемы просто, потому что Вы добавляете "краткий обзор" к своему классу. Например, если бы контракт "doSomething ()" метод выше потребовал, чтобы SomeType заполнил x, то y и z поля, когда к ним получили доступ через методы считывания и методы set, Ваш подкласс аварийно завершился бы независимо при использовании реального класса, который возвратил пустой указатель как базовый класс или абстрактный класс.

Общее эмпирическое правило для разработки иерархии классов является в значительной степени простой анкетой:

  1. Мне нужно поведение моего предложенного суперкласса в моем подклассе? (Y/N) Это - первый вопрос, который необходимо задать сами. Если Вам не нужно поведение, нет никакого аргумента в пользу разделения на подклассы.

  2. Мне нужно состояние моего предложенного суперкласса в моем подклассе? (Y/N) Это - второй вопрос. Если состояние соответствует модели того, в чем Вы нуждаетесь, это может быть canidate для разделения на подклассы.

  3. Если бы подкласс был создан из предложенного суперкласса, то это действительно было бы отношение ISA, или это - просто ярлык для наследования поведения и состояния? Это - заключительный вопрос. Если это - просто ярлык, и Вы не можете квалифицировать свой предложенный подкласс "поскольку-a" суперкласс, то наследования нужно избежать. Состояние и логика могут быть скопированы и вставлены в новый класс с другим корнем, или делегация может использоваться.

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

2
ответ дан 3 December 2019 в 01:09
поделиться

Существует несколько случаев, где мы не хотим позволять изменять поведение. Например, Строковый класс, Математика.

1
ответ дан 3 December 2019 в 01:09
поделиться

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

1
ответ дан 3 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

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