"А" VS "это как отношения А", что каждый из них означает и чем они отличаются? - PullRequest
6 голосов
/ 04 октября 2011

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

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 ", в приведенном выше примере, каждый ExactDuplicate, ExtraMethods или ExtraAttributes « - это » Foo. Хотя отношение " похоже на " существует между двумя дочерними классами, унаследованными от одного и того же родительского класса, в вышеприведенном примере каждый ExactDuplicate " подобен " каждому ExtraMethods или ExtraAttributes, и наоборот.

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

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

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

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

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

Любая помощь будет принята с благодарностью:)

1 Ответ

3 голосов
/ 04 октября 2011

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

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

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

...