Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
Приветствую. Чисто спортивный интерес.
Положим был базовой класс библиотеки, вообще говоря сторонней.
И мой, унаследованный от него.
public class Base {
    //появился в новой версии
    public void M1()
    {}
    public void M2()
    {
        M1();
    }
    
}

public class MyClass extends Base
{
    //этот был давно
    public void M1()
    {
    }

}

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

По идее внутри M2 дернет MyClass.M1 ?
8 авг 19, 00:00    [21944239]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ,
Ты накрутил слов про либы и библиотеки чтобы запутать?
Ты сменил код либы и тебе её надо перекомпилить.
Итого либа изменилась, а не осталась прежней.
Выходит полный ребилд всего и вся.
Задачка на два класса без всяких "было" и "стало".
Так?
8 авг 19, 08:45    [21944317]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
PetroNotC Sharp,
1. Оно же позволит перекомпилировать?
2. Вызываться будет метод M1 наследника?
8 авг 19, 08:58    [21944324]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ,
Сначала компилится либа с базовым. Потом охватывающий код main
2. Получаем:

Base b = new MyClass();
       b.M2();

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

Да
8 авг 19, 09:13    [21944335]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ
позволит
да. Но тогда вопрос. Какая разница что было раньше в коде если полный ребилд всего и вся?
8 авг 19, 09:18    [21944340]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
Тогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.
8 авг 19, 10:32    [21944414]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
забыл ник
Member

Откуда:
Сообщений: 3062
ЕвгенийВ
Тогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.

Именно поэтому наследование говно, хотя нет - ООП в целом говно.
А твой пример это классическая буква O в SOLID принципах. Можешь почитать тут например
8 авг 19, 10:38    [21944423]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.
8 авг 19, 10:49    [21944435]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ,
Как у вас в шарпе всё интересно.
Может твой вопрос про j#?
8 авг 19, 10:50    [21944438]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
PetroNotC Sharp
ЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.

В базовом такой метод может появиться позже.
8 авг 19, 10:58    [21944448]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
PetroNotC Sharp
ЕвгенийВ,
Как у вас в шарпе всё интересно.
Может твой вопрос про j#?

В великом и могучем C# не все методы виртуальные, если хочешь сделать это сознательно, помечаешь модификатором virtual.
8 авг 19, 10:59    [21944451]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
забыл ник
Member

Откуда:
Сообщений: 3062
ЕвгенийВ
PetroNotC Sharp
ЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.

В базовом такой метод может появиться позже.


Предпочитайте делегацию наследованию(с)
8 авг 19, 11:08    [21944461]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ
PetroNotC Sharp
ЕвгенийВ,
Когда прогер расширяет наследника методом дайДолжников()
не посмотрев что в базом он уже есть, то это диагноз.

В базовом такой метод может появиться позже.
опять логика от шарпа?
ПОЗЖЕ означает что прогер не смотрит что ли?
Я лично всю цепочку смотрю. Как жених смотрит тёщу делая предложение))) :)
8 авг 19, 11:13    [21944467]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ,
Аааа... вспомнил.
Ты опять про развитие базовой библиотеки либы если код вызова уже написан. Так что ли?
8 авг 19, 11:15    [21944471]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ
В великом и могучем
а в java такое в практике просто не актуально. Когда родители испортят жизнь детям)
8 авг 19, 11:18    [21944475]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
betelgeizex
Member

Откуда:
Сообщений: 87
ЕвгенийВ
Тогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.


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

"@Override" should be used on overriding and implementing methods

Code smell Major
8 авг 19, 11:21    [21944483]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
betelgeizex
ЕвгенийВ
Тогда это источник трудноуловимой ошибки, ибо метод M1 в базовом классе, может делать совсем не то, что в наследнике.


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

"@Override" should be used on overriding and implementing methods

Code smell Major

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

Анализаторы хорошо, но если это какой нибудь админ обновляет что то и не в зуб ногой про анализаторы?
8 авг 19, 11:27    [21944493]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
betelgeizex
Member

Откуда:
Сообщений: 87
ЕвгенийВ],

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

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

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


А вообще всё ООП - источник трудноуловимых ошибок
8 авг 19, 11:37    [21944506]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
betelgeizex
Member

Откуда:
Сообщений: 87
ЕвгенийВ
...
Короче, ситуация имеет место быть?

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


Стоп-стоп, анализаторы должны использовать не админы, а вы, при сборке проекта.
И вы сразу увидите, что ваш метод нечаянно перекрыл какой-то другой метод, и переименуете свой метод. Всё.
8 авг 19, 11:41    [21944510]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

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


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

P. S. "предполагается" - это человеческий фактор, если есть малейшая возможность вляпаться, человек вляпается.
8 авг 19, 12:09    [21944544]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
betelgeizex
И вы сразу увидите,
конечно. Если сам прогел страный и не знает контекст, то ide обычно варнинг шлет.
8 авг 19, 12:28    [21944564]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
ЕвгенийВ
betelgeizex
Поведение класса Base состоит в том, чтобы из метода М2 вызывать М1, при этом предполагается, что M1 может быть перекрыт в наследниках (иначе автор класса пометил бы M1 как 'final')


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

P. S. "предполагается" - это человеческий фактор, если есть малейшая возможность вляпаться, человек вляпается.
на это ты не найдешь однозначного ответа.
Все ставить private чтобы не вляпаться это тоже паранойя
8 авг 19, 12:30    [21944570]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
betelgeizex
Member

Откуда:
Сообщений: 87
ЕвгенийВ
betelgeizex
Поведение класса Base состоит в том, чтобы из метода М2 вызывать М1, при этом предполагается, что M1 может быть перекрыт в наследниках (иначе автор класса пометил бы M1 как 'final')


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

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


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

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

Так что в каждом подходе (C# vs Java) свои плюсы и минусы.
8 авг 19, 12:35    [21944577]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2773
betelgeizex
в каждом подходе (C# vs Java) свои плюсы и минусы.
+1
8 авг 19, 13:09    [21944628]     Ответить | Цитировать Сообщить модератору
 Re: Виртуальные методы  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4865
PetroNotC Sharp
betelgeizex
в каждом подходе (C# vs Java) свои плюсы и минусы.
+1

А как бы вы сделали, если проектировали язык с нуля?
8 авг 19, 13:58    [21944691]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить