Я использую ответ-нативная клавиатура-осведомленная прокрутка-представление .
Это, вероятно, будет работать:
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
<KeyboardAwareScrollView enableOnAndroid extraScrollHeight={pixels[50]}>
<LinearGradient colors={['#72afd3', '#37ecba']} style={styles.container}>
<TextInput placeholder='Hello World'/>
<View style={{height: 200}}/>
<TextInput placeholder='Hello World'/>
<View style={{height: 200}}/>
<TextInput placeholder='Hello World'/>
</LinearGradient>
</KeyboardAwareScrollView>
Ваш класс включает элементы данных; методы, которые выполняют основные внутренние операции на тех элементах данных, где функциональность никогда не должна изменяться, должны всегда быть закрытыми. Таким образом, методы, которые делают основные операции с Вашими элементами данных, такими как инициализация и выделение, должны быть закрытыми. Иначе Вы рискуете классами производной "второго порядка", получающими неполный набор включенных поведений; первые производные участники могли потенциально переопределить поведение класса.
Это все сказало, я думаю, что необходимо быть очень осторожными с определением методов как "защищенные виртуальный". Я соблюдал бы большую осторожность в определении методов как "защищенную виртуальный", потому что выполнение так не только объявляет возможность переопределения функциональности, но и до некоторой степени определите ожидание переопределенной функциональности. Это звучит мне как underdefined набор поведений для переопределения; у меня был бы четко определенный набор поведений для переопределения. Если Вы хотите иметь очень большой набор переопределяемых поведений, я изучил бы Аспектно-ориентированное программирование, которое допускает такую вещь очень структурированным способом.
При маркировке метода с виртуальным словом Вы позволяете пользователям изменять способ, которым выполняется часть логики. Во многих целях, который является точно, что Вы хотите. Я полагаю, что Вы уже знаете это.
Однако типы должны быть разработаны для этого вида расширения. Необходимо активно выбрать методы, где имеет смысл позволять пользователю изменить поведение. Если Вы просто хлопаете на виртуальном повсеместно, Вы рискуете разрушать целостность типа, она действительно не помогает пользователю понять тип, и можно представить много ошибок включая проблемы безопасности.
Я предпочитаю консервативный подход. Я отмечаю все свои классы с sealed
если я конкретно не хочу включить наследование и в тех (небольшое количество) случаи, я только делаю требуемые методы виртуальными.
Легко удалить sealed
отметьте, если класс должен измениться для разрешения наследования в будущем. Однако, если Вы хотите изменить класс, который уже используется в качестве базового класса для некоторого другого типа, Вы рискуете повреждать подкласс при изменении базового класса.
Моя точка зрения:
events
, его предпочтительное к protected
методы.protected
методы как возможные, если не возможный затем необходимо использовать его ;-).Выбор protected
private
преднамеренное проектное решение. Вы заявляете, что Ваш класс явно поддерживает использование, которые функционируют со всеми издержками (усилие по разработке и реализации), который идет с этим. Я только использовал бы protected
в тех ситуациях, где я знаю, что это необходимо, в основном потому что я делаю его сам. (Вы также найдете комментарии от разработчиков BCL в том же направлении как, что я сказал.)
virtual
/non-virtual
различие в производительности не важно на любой машине, которая достаточно мощна для выполнения Платформы.NET.
Нет, у Вас не может быть "слишком многих". Однако идея, что мы должны просто сделать каждый защищенный вместо частного или избежать "изолированный" любой ценой, просто глупа. Я сохранил бы "вспомогательные методы" и внутренние структуры данных частными.