Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Виртуальные методы / 25 сообщений из 48, страница 1 из 2
08.08.2019, 00:00
    #39846699
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
Приветствую. Чисто спортивный интерес.
Положим был базовой класс библиотеки, вообще говоря сторонней.
И мой, унаследованный от него.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Base {
    //появился в новой версии
    public void M1()
    {}
    public void M2()
    {
        M1();
    }
    
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class MyClass extends Base
{
    //этот был давно
    public void M1()
    {
    }

}


В моем классе был метод M1 со своей логикой. Обновили используемую библиотеку и в ней в базовом классе тоже появился M1.
Такой код
Код: java
1.
2.
Base b = new MyClass();
       b.M2();


По идее внутри M2 дернет MyClass.M1 ?
...
Рейтинг: 0 / 0
08.08.2019, 08:45
    #39846759
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ,
Ты накрутил слов про либы и библиотеки чтобы запутать?
Ты сменил код либы и тебе её надо перекомпилить.
Итого либа изменилась, а не осталась прежней.
Выходит полный ребилд всего и вся.
Задачка на два класса без всяких "было" и "стало".
Так?
...
Рейтинг: 0 / 0
08.08.2019, 08:58
    #39846766
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
PetroNotC Sharp,
1. Оно же позволит перекомпилировать?
2. Вызываться будет метод M1 наследника?
...
Рейтинг: 0 / 0
08.08.2019, 09:13
    #39846772
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ,
Сначала компилится либа с базовым. Потом охватывающий код main
2. Получаем:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Base b = new MyClass();
       b.M2();

public class MyClass extends Base
{
    public void M1()
    {
    }
}
public class Base {
    public void M1()
    {}
    public void M2()
    {
        M1();
    } 
}


Да
...
Рейтинг: 0 / 0
08.08.2019, 09:18
    #39846776
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВпозволитда. Но тогда вопрос. Какая разница что было раньше в коде если полный ребилд всего и вся?
...
Рейтинг: 0 / 0
08.08.2019, 10:32
    #39846810
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
Тогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.
...
Рейтинг: 0 / 0
08.08.2019, 10:38
    #39846811
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВТогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.
Именно поэтому наследование говно, хотя нет - ООП в целом говно.
А твой пример это классическая буква O в SOLID принципах. Можешь почитать тут например
...
Рейтинг: 0 / 0
08.08.2019, 10:49
    #39846818
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.
...
Рейтинг: 0 / 0
08.08.2019, 10:50
    #39846820
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ,
Как у вас в шарпе всё интересно.
Может твой вопрос про j#?
...
Рейтинг: 0 / 0
08.08.2019, 10:58
    #39846823
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
PetroNotC SharpЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.
В базовом такой метод может появиться позже.
...
Рейтинг: 0 / 0
08.08.2019, 10:59
    #39846824
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
PetroNotC SharpЕвгенийВ,
Как у вас в шарпе всё интересно.
Может твой вопрос про j#?
В великом и могучем C# не все методы виртуальные, если хочешь сделать это сознательно, помечаешь модификатором virtual.
...
Рейтинг: 0 / 0
08.08.2019, 11:08
    #39846830
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВPetroNotC SharpЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.
В базовом такой метод может появиться позже.

Предпочитайте делегацию наследованию(с)
...
Рейтинг: 0 / 0
08.08.2019, 11:13
    #39846834
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВPetroNotC SharpЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.
В базовом такой метод может появиться позже.опять логика от шарпа?
ПОЗЖЕ означает что прогер не смотрит что ли?
Я лично всю цепочку смотрю. Как жених смотрит тёщу делая предложение))) :)
...
Рейтинг: 0 / 0
08.08.2019, 11:15
    #39846837
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ,
Аааа... вспомнил.
Ты опять про развитие базовой библиотеки либы если код вызова уже написан. Так что ли?
...
Рейтинг: 0 / 0
08.08.2019, 11:18
    #39846840
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВВ великом и могучема в java такое в практике просто не актуально. Когда родители испортят жизнь детям)
...
Рейтинг: 0 / 0
08.08.2019, 11:21
    #39846847
betelgeizex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВТогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.

Не такой уж и трудноуловимой, если использовать анализаторы типа Sonar (а их надо использовать всегда):

Код: plaintext
1.
2.
3.
"@Override" should be used on overriding and implementing methods
 
Code smell Major
...
Рейтинг: 0 / 0
08.08.2019, 11:27
    #39846853
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
betelgeizexЕвгенийВТогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.

Не такой уж и трудноуловимой, если использовать анализаторы типа Sonar (а их надо использовать всегда):

Код: plaintext
1.
2.
3.
"@Override" should be used on overriding and implementing methods
 
Code smell Major

Короче, ситуация имеет место быть?

Анализаторы хорошо, но если это какой нибудь админ обновляет что то и не в зуб ногой про анализаторы?
...
Рейтинг: 0 / 0
08.08.2019, 11:37
    #39846863
betelgeizex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ],

А вообще, для чего вы наследуетeсь от класса Base? Видимо для того, чтобы наследовать поведение базового класса, правильно?

Поведение класса Base состоит в том, чтобы из метода М2 вызывать М1, при этом предполагается, что M1 может быть перекрыт в наследниках (иначе автор класса пометил бы M1 как 'final')

Переопределяя (overload aka 'new') метод M1, вы тем самым ломаете вышеописанное поведение базового класса в наследнике. Это про 'L' в SOLID.


А вообще всё ООП - источник трудноуловимых ошибок
...
Рейтинг: 0 / 0
08.08.2019, 11:41
    #39846867
betelgeizex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВ...
Короче, ситуация имеет место быть?

Анализаторы хорошо, но если это какой нибудь админ обновляет что то и не в зуб ногой про анализаторы?

Стоп-стоп, анализаторы должны использовать не админы, а вы, при сборке проекта.
И вы сразу увидите, что ваш метод нечаянно перекрыл какой-то другой метод, и переименуете свой метод. Всё.
...
Рейтинг: 0 / 0
08.08.2019, 12:09
    #39846897
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
betelgeizexПоведение класса Base состоит в том, чтобы из метода М2 вызывать М1, при этом предполагается, что M1 может быть перекрыт в наследниках (иначе автор класса пометил бы M1 как 'final')


Т. е. хорошая практика состоит в том, что бы помечать все public/protected методы как final, если они не предполагают переопределения?

P. S. "предполагается" - это человеческий фактор, если есть малейшая возможность вляпаться, человек вляпается.
...
Рейтинг: 0 / 0
08.08.2019, 12:28
    #39846907
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
betelgeizexИ вы сразу увидите,конечно. Если сам прогел страный и не знает контекст, то ide обычно варнинг шлет.
...
Рейтинг: 0 / 0
08.08.2019, 12:30
    #39846912
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВbetelgeizexПоведение класса Base состоит в том, чтобы из метода М2 вызывать М1, при этом предполагается, что M1 может быть перекрыт в наследниках (иначе автор класса пометил бы M1 как 'final')


Т. е. хорошая практика состоит в том, что бы помечать все public/protected методы как final, если они не предполагают переопределения?

P. S. "предполагается" - это человеческий фактор, если есть малейшая возможность вляпаться, человек вляпается.на это ты не найдешь однозначного ответа.
Все ставить private чтобы не вляпаться это тоже паранойя
...
Рейтинг: 0 / 0
08.08.2019, 12:35
    #39846917
betelgeizex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
ЕвгенийВbetelgeizexПоведение класса Base состоит в том, чтобы из метода М2 вызывать М1, при этом предполагается, что M1 может быть перекрыт в наследниках (иначе автор класса пометил бы M1 как 'final')


Т. е. хорошая практика состоит в том, что бы помечать все public/protected методы как final, если они не предполагают переопределения?

P. S. "предполагается" - это человеческий фактор, если есть малейшая возможность вляпаться, человек вляпается.

От кривых рук никакие анализаторы не защитят

Да, если метод "public final", то перекрыть (override) его не получится. Более того, не получится его и переопределить (hide) другим методом с такой же сигнатурой - в Java нет аналога 'new'. Это гарантирует, что вызывающий код всегда вызовет метод оригинального, базового класса.

Так что в каждом подходе (C# vs Java) свои плюсы и минусы.
...
Рейтинг: 0 / 0
08.08.2019, 13:09
    #39846940
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
betelgeizexв каждом подходе (C# vs Java) свои плюсы и минусы.+1
...
Рейтинг: 0 / 0
08.08.2019, 13:58
    #39846983
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальные методы
PetroNotC Sharpbetelgeizexв каждом подходе (C# vs Java) свои плюсы и минусы.+1
А как бы вы сделали, если проектировали язык с нуля?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Виртуальные методы / 25 сообщений из 48, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]