Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

Как унаследоваться от абстрактного класса?

Здравствуйте.
Есть три класса. Обычный, абстрактный и наследник абстрактного.
Обычный класс содержит переменную абстрактного, куда после неких манипуляций запишется объект наследника.
Абстрактный:
public abstract class LessonInfo { static String NAME; static int COUNT_QUESTION; static int[] PARTS;
static String[] INFO_QUESTIONS; static int[] MARK_QUESTIONS; }
Наследник:
public class RussianInfo extends LessonInfo {
static final String NAME = "Русский язык"; static final int COUNT_QUESTION = 24; static final int[] PARTS = {24};
static final String[] INFO_QUESTIONS = {"Определение главной информации текста", "Средства связи предложений", "Лексическое значение слова", "Постановка ударения", "Употребление паронимов", "Морфологические нормы", "Синтаксические нормы", "Правописание корней", "Правописание приставок", "Правописание суффиксов", "Правописание глаголов и причастий", "Правописание НЕ и НИ", "Слитное и раздельное написание слов", "Правописание -Н- и -НН_", "Пунктуация", "Обособленные члены предложения", "Пунктуация во второстепенных чл. предложения", "Пунктуация в СПП", "Пунктуация в разых тижах связи", "Смысловая целостность текста", "Функционально-смысловые типы речи", "Лексическое значение слова", "Средства связи предложений", "Средства выразительности" }; static final int[] MARK_QUESTIONS = {2,1,1,1,1,1,7,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,25};
}
Обычный (фрагмент):
public class TestActivity extends AppCompatActivity {
LessonInfo info; static LessonInfo lessonInfo;
@Override protected void onCreate(Bundle savedInstanceState) {
lessonInfo = new RussianInfo();
} }
После команды "ОбычноеАктивити.lessonInfo.MARK_QUESTIONS[i]" приложение не вылетает.
Что не так? Думаю, накосячил с абстрактным классом и его наследником


Ответ

Попробуй в абстрактном классе создать абстрактный метод initVariables и вызвать его в конструкторе абстрактного класса. В каждом из наследников реализовывать этот метод и инициализировать переменные именно в нем. Так же, не стоит в абстрактном классе переменные делать static, так как значение этой переменной будет одинаково для всех экземпляров класса.
Абстрактный:
public abstract class LessonInfo { public String name; public int countQuestion; public int[] parts;
public String[] infoQuestions; public int[] markQuestions;
public LessonInfo() { initVariables(); }
public abstract void initVariables(); }
Наследник:
public class RussianInfo extends LessonInfo{
@Override public void initVariables() { name = "Русский язык"; countQuestion = 24; parts = new int[]{24};
infoQuestions = new String[]{"Определение главной информации текста", "Средства связи предложений", "Лексическое значение слова", "Постановка ударения", "Употребление паронимов", "Морфологические нормы", "Синтаксические нормы", "Правописание корней", "Правописание приставок", "Правописание суффиксов", "Правописание глаголов и причастий", "Правописание НЕ и НИ", "Слитное и раздельное написание слов", "Правописание -Н- и -НН_", "Пунктуация", "Обособленные члены предложения", "Пунктуация во второстепенных чл. предложения", "Пунктуация в СПП", "Пунктуация в разых тижах связи", "Смысловая целостность текста", "Функционально-смысловые типы речи", "Лексическое значение слова", "Средства связи предложений", "Средства выразительности"}; markQuestions= new int[]{2,1,1,1,1,1,7,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,25}; } }
Активити:
public class MainActivity extends AppCompatActivity {
private LessonInfo lessonInfo;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
lessonInfo = new RussianInfo(); Log.d("MainActivity", "lessonInfo.name" + lessonInfo.name); Log.d("MainActivity", "lessonInfo.markQuestions" + lessonInfo.markQuestions.toString()); Log.d("MainActivity", "lessonInfo.infoQuestions" + lessonInfo.infoQuestions.toString()); } }
Кстати, переменной lessonInfo тоже не нужно ставить модификатор static

Комментариев нет:

Отправить комментарий