Змінюй хід війни! Допомагай ЗСУ!

Наследование от интерфейса или (и) от абстрактного класса

🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
Статус: Offline
Реєстрація: 10.06.2006
Повідом.: 3031
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #1
Наследование от интерфейса или (и) от абстрактного класса

Всем привет,
Посмотрим на следующий пример кода:

public interface ITest
{
void A;
}

public abstract class TestBase : ITest
{
public abstract void A();
public void B(){};
}

public class Test1 : ???
{
public override void A(){}
}
мне недавно коллега на работе задал вопрос, почему я наследую Test1 от TestBase и от ITest одновременно (??? = "TestBase, ITest"), а не от TestBase (??? = "TestBase")

Честно говоря, я так пишу довольно-таки давно, но даже решарпер подсказывает, что в этом нет смысла, т.к. TestBase наследуется от ITest.
скажите, есть ли разница на уровне IL? Может, дело в DI?

P.S. интерфейсный метод явно реализовывать в классе не собираюсь
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #2
интерфейсный метод явно реализовывать в классе не собираюсь
правильно собираешься, разницы нет
если ничего не путаю, то IL код, будет отличаться только тем что ITest будет приписан к Test1, и при рефлексии так и останется "TestBase, ITest"

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

ну и рекомендуется не дублировать интерфейсы на иерархии классов
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #3
правильно собираешься, разницы нет
если ничего не путаю, то IL код, будет отличаться только тем что ITest будет приписан к Test1, и при рефлексии так и останется "TestBase, ITest"

Разница в том, что если я явно укажу наследуемый интерфейс рядом с базовым классом, то смогу реализовывать интерфейсные методы.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #4
то смогу реализовывать интерфейсные методы
А что мешает тебе реализовать эти методы без прямого наследования? :)
Просто интересно :)

Наставят себе ломаных решарперов, а потом голову ломают над странными вопросами...
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #5
А что мешает тебе реализовать эти методы без прямого наследования? :)
Просто интересно :)

Наставят себе ломаных решарперов, а потом голову ломают над странными вопросами...

1. попробуй сам сначала, и ты ответишь на свой вопрос.
2. Решарпер у меня лицензионный. Честно говоря, когда я общаюсь с человеком, у которого не стоит решарпер (скажем в 10-й студии), то для меня это значит, что человек либо нереальный профи, либо нуб.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #6
ну а так ты их можешь заоверрайдить от абстрактного класса, все равно ты мимо него не пройдешь

2. Решарпер у меня лицензионный. Честно говоря, когда я общаюсь с человеком, у которого не стоит решарпер (скажем в 10-й студии), то для меня это значит, что человек либо нереальный профи, либо нуб.
а хоть раз нереальный профи без решарпера попадался?
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #7
попробуй сам сначала, и ты ответишь на свой вопрос.
Если бы у тебя было множественное наследование (тоесть TestBase бы не наследовал ITest), тогда ок. А так у тебя простейшая линейная иерархия. TestBase уже в любом случае отнаследовал и содержит методы интефейса, хоть и абстрактные, и смысла в указании интерфейса нет, ни тебе, ни другому, ни компилятору.

А если бы у тебя еще и иерархия интерфейсов была?
Код:
public interface [B]ITest2[/B] : [B]ITest[/B]
{
    void AA();
}

public abstract class [B]TestBase[/B] : [B]ITest2
[/B] {
    public abstract void A();
    public abstract void AA();
    public void B(){}
 }

Ты бы в Test1 прописывал все интерфейсы которые он отнаследовал через классы и абстракции?
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #8
1. попробуй сам сначала, и ты ответишь на свой вопрос.
Выше уже ответили про линейную иерархию. Разницы никакой нет.

2. Решарпер у меня лицензионный. Честно говоря, когда я общаюсь с человеком, у которого не стоит решарпер (скажем в 10-й студии), то для меня это значит, что человек либо нереальный профи, либо нуб.

У меня просто руки не и жопы + я стараюсь не заниматься поддержкой чужих соплей. А в своих соплях я и без решарпера прекрасно ориентируюсь :)

+ ну и плюс меня жаба давит за него платить, ну не вижу я смысла 250 баксов отдавать за "это"...
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #9
Выше уже ответили про линейную иерархию. Разницы никакой нет.

Ты можешь замокать класс, который наследуется от интерфейса через абстрактный класс?

У меня просто руки не и жопы + я стараюсь не заниматься поддержкой чужих соплей.

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

+ ну и плюс меня жаба давит за него платить, ну не вижу я смысла 250 баксов отдавать за "это"...
1. для всех нормальных .Net контор это маст-хэв, в чем я убеждаюсь по факту не первый раз. Вот заставить компанию раскошелиться на 2013 ultimate или 2015 prof ради code-lens - это уже другое дело.
2. напиши в jetbrains, что ты такой-то такой-то, что сам себе педалишь не для заработка и что не хочешь ломать их продукт. нескольким моим знакомым программистам они дали ключ.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #10
Ты можешь замокать класс, который наследуется от интерфейса через абстрактный класс?
Надо смотреть, тут могут сыграть роль ограничения тестового фреймворка. Со стороны .NET платформы не вижу проблем.

про его продуктивность при этом ему сразу сказали.
здесь та же фигня.
Есть замеры "продуктивности" с решарпером и без? Сомневаюсь. Если в солюшене линейные связи - решарпер в принципе не нужен. Если все через DI - у человека без решарпера будет уходить больше времени на "вникнуть" в суть той или иной проблемы (на начальных этапах работы над проектом)

для всех нормальных .Net контор
Возможно, но .NET у нас не основное направление, потому и решарпер не нужен.

педалишь не для заработка
Так я то педалю для заработка. Этот способ ничем не отличается от использования кряка.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #11
Надо смотреть, тут могут сыграть роль ограничения тестового фреймворка. Со стороны .NET платформы не вижу проблем.
.

Тестовый фреймворк тут ни при чем, если только ты не называешь тестовым фреймворком какие-нибудь Moq или Rhino Mock.

Со стороны платформы есть проблемы, например, ты не можешь переопределить реализацию методов базового класса, если эти методы не помечены, как виртуальные.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #12
правильно собираешься, разницы нет
если ничего не путаю, то IL код, будет отличаться только тем что ITest будет приписан к Test1, и при рефлексии так и останется "TestBase, ITest"

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

ну и рекомендуется не дублировать интерфейсы на иерархии классов

подтверждение моего поста:

Capture.PNG
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #13
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #14
Даже не представляю где такое может быть оправдано. Если такое имеет место, это значит одно: "архитектура - говно", и оправдания этому нет. Используя такое чудо можно супер-класс создать

Код:
class Super : TestBase, ITest, ITest2, ITest3, ITest4
{
    void ITest.A(){}
    void ITest2.A(){}
    void ITest3.A(){}
    void ITest4.A(){}
    void override A(){}
}

А потом тот кто будет разбираться, 100500 раз тебя проклянет когда будет выяснять: почему при касте экземпляра класса в разные интерфейсы и вызывая один и тот же метод (по идее) выводится совершенно разный результат?
 
Останнє редагування:
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #15
Даже не представляю где такое может быть оправдано. Если такое имеет место, это значит одно: "архитектура - говно", и оправдания этому нет. Используя такое чудо можно супер-класс создать

в реальной жизни я такие кейсы встречал, когда нужно использовать различные интерфейсы из разных сторонних компонентов с одинаковыми методами, так что это не признак плохой архитектуры.

Ну так сделай его виртуал :)

Не хочу создавать потенциально опасные места ради того, чтобы протестировать код. И ты не хочешь.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #16
подтверждение моего поста:
никакое это не подтверждение, я не очень понимаю зачем ты это лепишь вообще, похоже на то что ты пытаешься сделать подобие множественного наследования, нет такого в дотнете, ошибку пишит потому что ты нарушаешь правила, не получится метод А и с базового класса взять и реализовать рядом интерфейс, это единая реализация должна быть

в реальной жизни я такие кейсы встречал, когда нужно использовать различные интерфейсы из разных сторонних компонентов с одинаковыми методами, так что это не признак плохой архитектуры.
есть паттерн адаптер, им можно пользоваться

Не хочу создавать потенциально опасные места ради того, чтобы протестировать код. И ты не хочешь.
а в чем опасность виртуала? все равно будет вызываться callvrt для этого метода
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #17
когда нужно использовать различные интерфейсы из разных сторонних компонентов с одинаковыми методами
для этого существует namespace. Интерфейс должен быть прозрачным и читаемым. Если нужно соорудить чтото с таким же интерфейсом, то нужно просто имплементить отдельный класс (со стабами ненужных методов) от этого интерфейса. Очень рекомендую перечитать SOLID, а конкретнее в этом случае S и I, и глубоко понять о чем они.
 
  • 🟡 12:06 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #18
для этого существует namespace. Интерфейс должен быть прозрачным и читаемым. Если нужно соорудить чтото с таким же интерфейсом, то нужно просто имплементить отдельный класс (со стабами ненужных методов) от этого интерфейса. Очень рекомендую перечитать SOLID, а конкретнее в этом случае S и I, и глубоко понять о чем они.

Почему в каждой теме, которую я создаю в этом разделе, появляются псевдо-профи и несут какую-то хуйню? Мало того, что ты несёшь хуйню и не понял мой вопрос, так ещё и почему-то тыкаешь меня носом в солид.
Косяк, мне кажется, кстати, я в одной из тем просил тебя не писать в моих темах.

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


есть паттерн адаптер, им можно пользоваться


а в чем опасность виртуала? все равно будет вызываться callvrt для этого метода

Я не пытаюсь делать множественное наследование, причём тут это.
Я задал в стартпосте нормальный вопрос, но вместо ответа, почему-то, люди мне пишут про паттерны, тыкают носом и т.д.
Я же не задачу пытаюсь решить, это теоретический вопрос, на который я уже ответил.
 
Останнє редагування:
Назад
Зверху Знизу