Миксин против наследования
В чем разница между mixin и наследованием?
Ответы
Ответ 1
Компоновка обычно используется с множественным наследованием. Таким образом, в этом смысле "нет разницы".
Деталь заключается в том, что Mix in редко используется в качестве автономного объекта.
Например, скажем, у вас есть имя Mix In "ColorAndDimension", которое добавляет свойство цвета, ширину и высоту.
Теперь вы можете добавить ColorAndDimension, например, в Shape Class, Sprite Class, Car Class и т.д. И все они будут иметь один и тот же интерфейс (например, get/setColor, get/setHeight/Width и т.д.).
Итак, в общем случае Mix в IS-наследовании. Но вы можете утверждать, что это вопрос роли класса в общей области в отношении того, является ли Mix in "основным" или просто смешанным.
Изменить - просто уточнить.
Да, Mix In можно рассматривать в современном современном жаргоне Интерфейс с соответствующей реализацией. Это действительно простое, старое, повседневное многократное наследование, использующее простой, старый, повседневный класс. Это просто случайное применение ИМ. Большинство языков не дают Mix. В любом специальном статусе это просто класс, который был предназначен для "смешения", а не для использования отдельно.
Ответ 2
mix-in - это конкретный ограниченный случай (множественного) наследования, используемого для целей реализации; некоторые языки (например, Ruby) поддерживают его без поддержки обобщенного множественного наследования.
Ответ 3
В чем разница между mixin и наследованием?
A mix-in - это базовый класс, который вы можете наследовать, чтобы обеспечить дополнительную функциональность. Название "mix-in" означает, что оно должно смешиваться с другим кодом. Таким образом, вывод состоит в том, что вы не создадите экземпляр класса mix-in самостоятельно. Часто смешивание используется с другими базовыми классами. Поэтому mixins являются подмножеством или особым случаем наследования.
Преимущества использования смешения над одним наследованием заключаются в том, что вы можете написать код для функции один раз, а затем использовать ту же функциональность в нескольких разных классах. Недостатком является то, что вам может потребоваться найти эту функциональность в других местах, чем там, где она используется, поэтому полезно смягчить этот недостаток, поддерживая ее.
Я лично нашел соединение, необходимое для использования по одному наследованию, где мы убираем много похожего кода, но тестовые примеры создаются на основе их наследования базового случая и единственный способ сохранить (и в том же модуле), не возившись с номерами покрытия, является наследованием от объекта и наследует дочерние случаи как из универсальной базы тестового теста, так и из настраиваемой базы, которая применима только к ним.
Микшины в сравнении и контрасте с абстрактными базовыми классами
Оба являются формой родительского класса, который не предназначен для создания экземпляра.
A mixin обеспечивает функциональность, но не может напрямую ее использовать. Пользователь должен использовать его через (под) класс.
абстрактный базовый класс предоставляет интерфейс, но без использования функциональности. Пользователь должен создать функциональность, называемую интерфейсом.
В Python некоторые классы в модуле abc
являются примерами родительских классов, которые обеспечивают функциональность через наследование и абстрактные интерфейсы, которые должны выполняться подклассом. Эти идеи не являются взаимоисключающими.
Резюме
Проще говоря, микс - это просто базовый класс, который вы бы не создавали самостоятельно и обычно использовали в качестве вторичного базового класса при множественном наследовании.
Ответ 4
"Mixin - это фрагмент класса в том смысле, что он предназначен для составления с другими классами или миксинами". -DDJ
Mixin - это фрагмент класса или кода, который не предназначен для автономного использования, но вместо этого вы должны использовать его внутри другого класса. Либо составьте его как поле/переменную члена или как сегмент кода. Я больше всего подвержен последним. Это немного лучше, чем скопировать код шаблона.
Здесь представлена отличная статья DDJ, в которой представлен предмет.
SDK Half-Life 2/ "Source" - отличный пример С++-микшинов. В этой среде макросы определяют значимые блоки кода, которые могут быть добавлены, чтобы дать классу определенный "вкус" или функцию.
Посмотрите пример источника wiki: Создание логической сущности. В примере кода макрос DECLARE_CLASS можно считать микшином. Source SDK широко использует миксины для стандартизации кода доступа к данным и приписывает поведение сущностям.
Ответ 5
Mixin - абстрактная концепция, и все, что соответствует ее требованию, можно рассматривать как mixin.
Вот определение из Википедии.
В объектно-ориентированных языках программирования mixin - это класс, который содержит методы для использования другими классами, не будучи родительским классом этих других классов. Как другие классы получают доступ к методам mixin, зависит от языка. Микшины иногда описываются как "включенные", а не "унаследованные".
Короче говоря, ключевое отличие от наследования состоит в том, что для микса не нужно иметь отношения "is-a", как в наследовании.
С точки зрения реализации, вы можете рассматривать его как интерфейс с реализациями. Например, абстрактный класс в Java можно рассматривать как mixin, если Java поддерживает множественное наследование.
Ответ 6
При множественном наследовании новый класс может состоять из нескольких суперклассов. Вы можете вызывать только методы, определенные в любом из суперклассов.
С другой стороны, mixin является абстрактным подклассом, который может использоваться для специализации поведению различных родительских классов. Mixins могут вызывать метод (например, sayHello(): String
), хотя они не определяют такой метод.
mixin M {
name: String
defmethod greetings() { print sayHello() + " " + name}
}
Как вы видите, вы можете вызвать sayHello()
, хотя он нигде не определен. Если вы добавите mixin M
в класс C
, C
должен предоставить метод sayHello()
.
Ответ 7
Я думаю, что важно отметить, что mixin не подразумевает наследование. Согласно wikipedia, Mixin:
В объектно-ориентированных языках программирования mixin - это класс, который содержит методы для использования другими классами, не требуя родительский класс этих других классов. Как эти другие классы доступ к методам mixin зависит от языка. Смешины иногда называемый "включенным", а не "унаследованным".
В частности, на языке, подобном perl, mixins можно добавить с помощью модуля Exporter:
package Mixins;
use Exporter qw(import);
our @EXPORT_OK = qw(pity);
# assumes it will be mixed-in to a class with a _who_do_i_pity method
sub pity {
my ($self) = @_;
printf("I pity %s\n", $self->_who_do_i_pity('da foo'));
}
который может быть смешан с любым модулем, содержащим один или несколько методов (ов) за раз:
package MrT
use Mixins qw(pity);
sub new {
return bless({}, shift);
}
sub _who_do_i_pity {
return 'da foo!'
}
Затем в вашем модуле MrT
можно использовать:
use MrT;
MrT->new()->pity();
Я знаю его абсурдный пример, но он получает точку в...
Ответ 8
ТЛ; дг
mixin и множественное наследование имеют одинаковую форму. Но имеют различную семантику: mixin имеет базовые классы, обеспечивающие реализацию функции. Для наследования базовые классы предоставляют интерфейс, а подкласс имеет реализацию.
Но в любом случае композиция предпочтительнее, чем смесь IMO