"А" VS "это как отношения А", что означает каждый из них и чем они отличаются?

Первый пример для обсуждения:

class Foo
{
    // Attributes:
    int attribute1, attribute2;

    // Methods:
    virtual void Foo1()
    {   /* With or without Implementation   */  }
    virtual void Foo2()
    {   /* Also with or without Implementation */ }
};

class ExactDuplicate: Foo   // No New Attributes or Methods
{   
    virtual void Foo1()
    {   /* A new Implementation */  }

    // Also there might be new Implementations to other methods
};

class ExtraMethods: Foo     // Having New Methods
{
    virtual void Foo3()
    {   /* Implementation   */  }
};

class ExtraAttributes: Foo  // Having New Attributes
{
    int attribute3;
};

У меня была дискуссия с моим учителем об отношениях "есть А" и "как как А" и как они отличаются.

Мое мнение (которое я читаю где-то, что я не могу вспомнить) заключается в том, что отношение "является A" находится между родительским классом и дочерним классом, который наследуется от него, и на него не влияют добавление новых методов или атрибутов, поэтому любой экземпляр из дочернего класса "is A" Родительский класс, в приведенном выше примере, каждый ExactDuplicate, ExtraMethods, или же ExtraAttributes "это" Foo, В то время как отношение "похоже на A" существует между двумя дочерними классами, унаследованными от одного и того же родительского класса, в приведенном выше примере каждый ExactDuplicate "как" каждый ExtraMethods или же ExtraAttributesи наоборот.

Мое мнение Учителя состояло в том, что отношение "является A" находится между родительским классом и только дочерними классами, которые не добавляют никаких дополнительных методов или атрибутов, поэтому в приведенном выше примере существует только одно отношение "является A" между Foo а также ExactDuplicate, Несмотря на то, что отношение "похоже на A" находится между родительским классом и дочерними классами, которые добавляют дополнительные методы или атрибуты, поэтому в приведенном выше примере существует отношение "похоже на A" между Foo и каждый из ExtraMethods а также ExtraAttributes,

Я думаю, что отношение "является А", как определено моим учителем, не очень полезно, потому что в большинстве случаев нет причин менять реализацию, если ничего не добавлено. Это точка. Еще один Car "НЕ как" Vehicle, это на самом деле "это" Vehicleв то время как Van "Это как A" Car, поскольку оба ассоциируют некоторые характеристики.

Так что правильно и почему? Я был бы очень признателен, объясняя.

Кроме того, если мнение моего учителя является верным, делает ли добавление только атрибутов отношения "похожими на А" или требует добавления новых методов, чтобы стать отношениями "похожими на А"? и что (если существует) это отношения между дочерними классами.

Надеюсь, мой квест является ясным и понятным.

Любая помощь будет высоко ценится:)

1 ответ

Решение

Поскольку термины обычно используются, вы правы, а ваш учитель неправ.

Is-A допускает расширение. Дочерний объект может иметь атрибуты, операции и т. Д., Не разрешенные родителем. С точки зрения ООП, решающим моментом является то, что экземпляр потомка может использоваться вместо экземпляра родителя при любых обстоятельствах (Правка: что, я, наверное, должен упомянуть, называется принципом подстановки Лискова, часто сокращенно LSP, названный в честь его создателя Барбары Лисков).

Is-like-A используется в основном для описания ошибок - когда кто-то пытается получить квадратное наследование от прямоугольника (или наоборот), для очевидного примера. Ни один из них не является продолжением другого, потому что ни один из них не обладает всеми характеристиками другого. Ни один из них не должен наследовать от другого, потому что может быть обстоятельство, при котором замена одного на другой либо не работает (предлагаемый дочерний элемент не соответствует требованиям быть родителем), либо может что-то нарушить (изменение, разрешенное родителем) сломал бы инвариант ребенка).

Другие вопросы по тегам