Реализация интерфейса. Вопрос вкуса?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by BrainDeaD, 3 Feb 2011.

  1. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    Интересует ваше мнение.

    Допустим, имеется базовый класс и дочерний класс, переопределяющий его методы. Оба эти класса могут реализовать определённый интерфейс.

    Какой из двух вы выберете для реализации? И самое главное почему?

    Вот пример на C# для ясности:
    Code:
    public Interface IA
    {
          void Method A();
    }
    
    Вариант 1:
    Code:
    public abstract Class A : IA
    {
          public abstract void Method A();
    }
    
    public Class B : A
    {
          public override void Method A()
          {
          }
    }
    
    Вариант 2:
    Code:
    public abstract Class A
    {
          public abstract void Method A();
    }
    
    public Class B : A, IA
    {
          public override void Method A()
          {
          }
    }
    
     
    #1 BrainDeaD, 3 Feb 2011
    Last edited: 3 Feb 2011
  2. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Вариант 1.
    так как
     
    #2 Irdis, 3 Feb 2011
    Last edited: 3 Feb 2011
  3. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    в таком случае, да. но я скорее использовал бы что-то вроде этого

    Code:
    void foo(IA ia)
    {
    //
    }
    [B]IA[/B] a =new B();
    foo(a);
    в этом то и смысл инерфейса. и тогда ответ снова неоднозначен.

    @all: ещё будут мнения?
     
  4. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Почитай книгу Троелсена "Язык программирования C#2008 и платформа .NET 3.5"
    В ней как раз описывается эта тема.
     
    1 person likes this.
  5. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    читал его c# 2005 .net 3.0. думаю, они не сильно отличаются. не помню такого примера. да и как бы всю книгу ворошить ради одного примера - немного геморно. если можно в кратце, что говорилось об этом примере?
     
  6. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Вариант 2... Это чисто удача, что попали в метод MethodA.
    Это не естественная ситуация.

    У вас на каком-то уровне приложения МОЖЕТ возникнуть объект типа A! Но использовать его в методе foo вы сможете, только через приведение типов. И даже так вы не гарантируете, что вы всегда сможете привести, а это лишняя проверка.
     
    1 person likes this.