Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для BirviZ
1 / 1 / 2
Регистрация: 11.10.2015
Сообщений: 82

Как унаследовать класс, изменив пару полей

09.02.2016, 17:16. Показов 1274. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно задача.
Хочу создать свой класс унаследованній от другого(JLabel).
Мне это нужно для того, что бы во всех экземпляра поменять несколько параметров (setHorizontalAlign(CENTER)).

Вопрос. Мне нужно в моем классе переопределить все варианты конструктора?
Может можно коем то образом этот метод определить как статический?
Может еще какой вариант?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2016, 17:16
Ответы с готовыми решениями:

Как правильно унаследовать класс?
Есть класс для работы с большими целыми знаковыми числами. public class BigNum { static int base = 100; static int...

ООП в javascript - как унаследовать класс и добавить свои методы, аттрибуты ?
Собственно, хочу сделать инструмент по работе с картинкой (вырезать область, отзеркалить, вписать в размер) Аналог такого либо такого ...

Унаследовать класс от Canvas
Возможно ли создать свой класс, наследующий HTMLCanvasElement? Чтобы с объектом этого класса можно было обращаться и как с эквивалентом...

15
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
09.02.2016, 17:38
Вроде проблем не вижу. Просто перегрузите только необходимый Вам конструктор (к примеру, выбираете только тот, что получает в себя String text

Java
1
2
3
4
5
6
7
8
import javax.swing.*;
 
public class MyLabel extends JLabel {
    public MyLabel(String text) {
        super(text);
        setHorizontalAlignment(CENTER);
    }
}
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
09.02.2016, 17:48
Вот как-то так:
Java
1
2
3
4
5
6
7
8
public class MyJLabel extends javax.swing.JLabel {
 
    @Override
    public void setHorizontalAlignment(int alignment) {
        super.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    }
 
}
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
09.02.2016, 20:59
Цитата Сообщение от Max_Sys Посмотреть сообщение
Вот как-то так:
И потом долго думать, отчего же сеттер не меняет параметр.
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
09.02.2016, 21:19
Цитата Сообщение от korvin_ Посмотреть сообщение
И потом долго думать, отчего же сеттер не меняет параметр.
На сколько я понял, так ставится задача в данном случае.
А какой еще вариант?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
09.02.2016, 22:29
Цитата Сообщение от Max_Sys Посмотреть сообщение
На сколько я понял, так ставится задача в данном случае.
А какой еще вариант?
Выше уже дали правильный ответ.
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
09.02.2016, 23:19
korvin_,
Нетбинс говорит мне, что не очень хорошо использовать вызов таких методов в конструкторе.
Хотя согласен, что здесь это не сильно принципиально, а мой вариант может принести больше проблем
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
09.02.2016, 23:24
Цитата Сообщение от Max_Sys Посмотреть сообщение
Нетбинс говорит мне, что не очень хорошо использовать вызов таких методов в конструкторе.
Он, в общем-то, правильно говорит. Только есть такая штука, называется Java Bean, и там это считается нормальным. Поскольку речь у ТСа о визуальном компоненте, то «Java Bean style constructor» с вызовом публичного переопределяемого сеттера вполне приемлем.
1
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
10.02.2016, 08:25
korvin_, подскажите, а в чем проблемы с моим вариантом?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
10.02.2016, 09:51
Цитата Сообщение от RedPatrick Посмотреть сообщение
а в чем проблемы с моим вариантом?
Не могу разобраться с "В конструкторе существует вызов метода, который можно переопределить."
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
10.02.2016, 11:29
Благодарю. А есть идеальный вариант в таком случае?
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
10.02.2016, 21:59
Самый православный способ.
Java
1
2
3
4
5
6
 @Override
    public void setHorizontalAlignment(int alignment) {
        if (alignment != javax.swing.SwingConstants.CENTER)
            throw new IllegalArgumentException("unsupported value: " + alignment);
        super.setHorizontalAlignment(alignment);
    }
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
10.02.2016, 22:38
Цитата Сообщение от RedPatrick Посмотреть сообщение
А есть идеальный вариант в таком случае?
Идеальных вариантов не бывает. В обсуждаемом случае можно решить вопрос использованием фабрики, типа того, условно:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public final class WidgetFactory {
    
    public static JLabel createLabel(final String text) {
        return new JLabel(text);
    }
    
    public static JLabel createCenteredLabel(final String text) {
        final JLabel l = new JLabel(text);
        l.setHorizontalAlignment(SwingConstants.CENTER);
        return l;
    }
    
    private WidgetFactory() {}
}
в этом случае и переопределять ничего не надо, и виртуальный метод вызывается не в конструкторе, а после создания объекта.

Цитата Сообщение от aleksandy Посмотреть сообщение
Самый православный способ.
Нет. Это нарушает контракт родительского класса. И вообще делает поведение неочевидным.
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
14.02.2016, 23:00
Цитата Сообщение от korvin_ Посмотреть сообщение
Это нарушает контракт родительского класса. И вообще делает поведение неочевидным.
С какого это перепоя контракт нарушается? Согласно документации метод может принимать одно из 5 возможных значений. Где тут сказано, что потомки не могут сузить эти значения до 1? А ежели заглянуть в исходники, то можно обнаружить вот такой метод, в котором можно узреть предлагаемое мною решение, вынесенное в отдельный метод.

Ввиду моего незнания о существовании подобного метода я предложил выполнить проверку непосредственно внутри setHorizontalAlignment(), вариант с переопределением этого метода будет чище с точки зрения ООП. Но это ни коим образом не делает поведение компонента неочевидным, достаточно просто правильно сформулировать соообщение об ошибке.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
15.02.2016, 00:57
Цитата Сообщение от aleksandy Посмотреть сообщение
С какого это перепоя контракт нарушается?
С такого, что код, использующий тип T ожидает, что все объекты субтипов T будут вести себя одинаково (принцип подстановки Лисков). Например, имеем метод меняющий выравнивание нескольких лэйблов:

Java
1
2
3
void setHorizontalAlignment(final int alignment, final List<JLabel> labels) {
    labels.forEach(label -> label.setHorizontalAlignment(alignment));
}
И всё шло бы хорошо, если бы не переопределение метода setHorizontalAlignment в MyLabel. Теперь этот код будет падать, если в списке лэйблов окажется инстанс MyLabel и нам придётся делать уродливый костыль:

Java
1
2
3
4
5
6
7
public static void setHAlign(final int alignment, final List<JLabel> labels) {
    labels.forEach(label -> {
        if (!label instance of MyLabel) {
            label.setHorizontalAlignment(alignment));
        }
    });
}
А если вдруг появится очередной такой наследник, решивший «сузить» варианты, добавлять ещё один if? А если setHAlign — не наш метод и у нас нет исходников, а свой лэйбл поместить в этот список хочется, то что, реализовывать свой аналог метод setHAlign? И всех других таких методов? Отличный code reuse.

Цитата Сообщение от aleksandy Посмотреть сообщение
Где тут сказано, что потомки не могут сузить эти значения до 1?
В толковом словаре, в описании слова «to extend».

Цитата Сообщение от aleksandy Посмотреть сообщение
А ежели заглянуть в исходники, то можно обнаружить вот такой метод, в котором можно узреть предлагаемое мною решение, вынесенное в отдельный метод.
Как будто исходники Swing — образец для подражания.

Цитата Сообщение от aleksandy Посмотреть сообщение
Но это ни коим образом не делает поведение компонента неочевидным, достаточно просто правильно сформулировать соообщение об ошибке.
См. выше.
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
15.02.2016, 08:59
Здесь полностью согласен с korvin_, мне кажется, при наследовании варианты aleksandy иMax_Sys вызовут неочевидные проблемы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2016, 08:59
Помогаю со студенческими работами здесь

От класса Таблица унаследовать класс Ячейка
Для начала задание: есть классы строка и таблица, обработчик. Класс обработчик позволяет выводить список записей таблицы отсортированных по...

Можно ли унаследовать заранее неизвестный класс?
Всем привет! Помогите, пожалуйста разобраться с наследованием в C++. Я пока новичок, хочу написать нейронную сеть. Столкнулся с...

Создать класс машина и унаследовать автобус
Добрый день. Две лабы надо сделать. Одну сделал она легкая - создать класс машина и унаследовать автобус. Заполнить методами и полями, это...

Создать класс Машина и унаследовать от него Грузовик
помогите пожалуйста, напишите полный код. Буду очень благодарен! Перепечатывайте задание на форум в виде текста

Создать класс Машина и унаследовать от него Грузовик
Создать класс Машина, содержащий в качестве параметров марку(строка), число цилиндров, мощность. Определить конструкторы, деструктор и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru