Симуляция множественного наследования.

  • Автор темы Автор темы Vijon
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
очень интересно стало, что Vijon ожидает получить через метод Пэрент Колеса которое есть наследник Резины и Диска одновременно?
 
очень интересно стало, что Vijon ожидает получить через метод Пэрент Колеса которое есть наследник Резины и Диска одновременно?
Если я вызываю метод Пэрент примерно со следующей сигнатурой...

PHP:
$this->Parent("Disk", "Width");

то он возвращает мне ширину Диска.

При "обычном" же вызове...

PHP:
$this->Width;

возвращается ширина Резины, она же - ширина Колеса.
 
Vijon, а почему ширина колеса это ширина Резины а не Диска?

И скажи, что в таком случае цена колеса? Тоже цена резины, или цена Диска?

А список автомобилей, к которым подходит колесо это список к которым подходит Резина или Диск? Если следовать логике, то нужен список Диска, но судя по ширине получим от Резины. А почему?
 
Храку.

Вы, дорогой товарисч с Киева, судя по Вашему возрасту - либо студент либо "младший научный сотрудник". Золотое время... Никакой ответственности, есть возможность торчать на форумах и "прикалываться"...

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

Поэтому, если Вы хотите со мной общаться, смените тон. Пишите с уважением к собеседнику и по делу.

Модераторам.

Обратите, пожалуйста, внимание на "шалости" данного участника.

-~{}~ 18.12.08 16:21:

Как я уже писал, я не автомобилист. Я предположил, что Ширина Колеса определяется Шириной Резины. Если это не так, то у Колеса, должно быть свое свойство Ширина, а Ширину Резины нужно извлекать опять-таки через Пэрент.

...Или Вас интересует, почему при прямом вызове Ширины берется именно Ширина Резины? Потому, что Резина была определена позднее. Если определить Диск после Резины, то и Ширина Колеса будет Шириной Диска.

Цена Колеса - это Цена Колеса. Возможно ее стоит определять как сумму Цен Диска и Резины, каковые свойства будут вызываться через Пэрент.

Аналогично, со Списком Автомобилей. Это самостоятельное свойство Колеса, получаемое интерсекцией одноименных свойств Диска и Резины.

Вообще, вынужден заметить, что не совсем понимаю причины спора. Множественное наследование - не более, чем возможность. Эту возможность можно использовать в определенных ситуациях или не использовать, если нет необходимости. Но лучше иметь возможность и не воспользоваться ей, чем не иметь как раз тогда, когда она бы очень пригодилась.
 
dimagolov
Думается, что ширина колеса это ширина наибольшей его части. Диски обычно шире шины. Цена это сумма цен всех его частей, возможно ещё за сборку колеса определённая цена должна иметься.
А со списком, я думаю, ровно в обратную сторону нужно смотреть - какие колёса подходят данному автомобилю.

Вообще же тема нужности и ненужности множественного наследия обсосана много раз и врядли умники вроде HraKK'а скажут что-то новое в этой области.
Вообще, имхо, если потребовалось множественное наследование, то это первый звоночек к мысли "стоит сменить язык программирования".
 
Vijon, если не хочешь понимать на примерах, спрошу прямо.
Множественное наследование это абстракция. Другое дело, что абстракция левая и в большинстве своем ничего кроме проблем не создающая, но не в этом суть. Есть концептуальная проблема наличия одноименных свойств/методов в разных предках. Эта проблема решается синтаксически (например по очередности предков в декларировании наследника), но это реально ничего не решает. Так как для абстракции предка одни из таких одноименных свойств надо брать от одного предка, а други от другого, что вынуждает переопределять все подобные свойства в предке и фактически писать никому не нужный код, который ничего полезного не делает, а только борется с этой проблемой. Поэтому вопрос, нафиа такая абстракция?

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

Для dimagolov

Знаете, я очень активно использую множественное наследование в ЯваСкрипте. И проблема, о которой Вы говорите, мне, в общем, известна. Ну что я могу сказать. Каждому программному средству - свое место. Я, собственно, уже писал об этом выше. Бывают ситуации, в которых множественное наследование очень бы пригодилось, причем, с гарантированным отсутствием коллизий. А нет, так нет. Никто ведь не принуждает...
 
Слов нет, мало того что нуна помнить все методы и свойства каждого класса, дык еще нужно помнить в какой последовательности они добавлялись.. Ты хочешь во время разработки зря время не терять и активно свою память развивать?
В итоге когда запутаешься будешь использовать ток свой метод парент и все. И поделка твоя станет бесполезной

Не проще сделать хотябы что то типа
PHP:
class Tire {
    public property $size;
    public function method () {
    }
}

class Disk {
    public property $size;
    public function method () {
    }
}

class Wheel {
    public function __construct () {
        $this -> tire = new Tire ();
        $this -> disk = new Disk ();
    }
    public function __get ($k) {
        list ($obj, $prop) = explode ("_", $k);
        return $this -> $obj -> $prop;
    }

    public function __set ($k, $v) {
        list ($obj, $prop) = explode ("_", $k);
        return $this -> $obj -> $prop = $v;
    }
    public function __call ($m, $a) {
        list ($obj, $m) = explode ("_", $k);
        return $this -> $obj -> $m ($a);
    }
}

$w = new Wheel ();
echo $w -> disk_size;
$w -> tire_method ();

Код Wheel можно вынести в отдельный класс, ток конструктор менять. Все бонально и просто :)
 
Множественное наследование, чаще всего, используется в ситуациях, когда классы-предки дополняют друг-друга, и конфликты имен между ними весьма редки (если вообще есть).

А помнить сами свойства и методы Вам так или иначе придется. Вы же должны их как-то вызывать.

По поводу того, не проще ли... Я уже писал об этом... Если бы мне подходили тривиальные варианты, я бы не создавал тему.
 
Вообще, имхо, если потребовалось множественное наследование, то это первый звоночек к мысли "стоит сменить язык программирования".
Стоит подумать над тем что ты делаешь, в 99.9999999999999% ты делаешь просто это не правильно.
 
Извините за офтоп, но откуда в JS взялось наследование вообще, не говоря уж о множественном? Там ведь классов нет в принципе, есть объекты и их прототипы только?
 
Vijon
Python.

dimagolov
Думаю, тут всё-таки неверно выбран пример - колесо не является потомком шины или диска. Ко второму ближе, но в таком случае обычное наследование лучше было бы.

Vijon
В PHP множественное наследование без костылей симулируется просто несколькими классами, каждый из которых наследует только один, то есть наследование по цепочке.
Но в любом случае, с наследованием нужно обращаться очень осторожно, при неграмотном обращении оно очень повышает сложность программы.
 
Ну дык помнить то помнить, просто ты добавляешь еще в свою память помнить последовательность - кто главнее. Тебе оно надо? Что то понять не могу, какое принципиальное отличие $w -> disk_size или у тебя, если диск главный то $w -> size. Откроешь ты код свой через полгода, и подумаешь "Бля, а что у меня size.." И полез по файлам смотреть. А в моем случае ты сразу поймешь что есть что. А, понял, фрилансерам некогда на лишние буквы нажимать. Так что ль? :)
 
По поводу Вашего примера.

Во-первых, Вам все-таки нужно помнить не только название метода, но имя класса. Ну хорошо, если названия одинаковые, никуда не денешься. А если разные? Вы не может просто вызвать метод ГетВэлью. Вам нужно еще помнить в каком классе-предке он лежит. У Вас, скажем пять классов-предков и в них около двухсот методов. Вы будете запоминать весь мэпинг? А если окажется, что метод ГетВэлью все-таки больше подходит не к классу Гет, а к классу Тулл, то Вам во всем коде нужно будет поменять Гет_ГетВэлью на Тулл_ГетВэлью?

Во-вторых... Вот, мой пример. Есть, скажем, класс Рекордсет. Он наследует классам Колумз, Роуз, Селекшен, Стринг, ДБ, Модулейшен... Коллизий между методами - никаких. Зато все классы-предки активно используют свойства друг-друга. В предложенной Вами концепции эта задача не решается, в предложенной мной - таки да...

-~{}~ 18.12.08 17:13:

Для Angerslave

Да, разумеется... На такая конструкция не кажется мне очень уж изящной.
 
dimagolov

В ЯваСкрипт есть аналоги классов, то есть, каждую функцию можно вызвать как экземпляр класса, и есть множественное наследование посредством метода колл...

PHP:
function SomeClass(arg)
{
        Parent1.call(this, arg);
        Parent2.call(this);

        this.Pr=0; // public
        var pr=0;  // private

        this.Mtd=function() {} // Method
}

var obj=new SomeClass(1);
 
Ваш рекорд сет называется мешаниной.
> у хорошо, если названия одинаковые, никуда не денешься. А если разные?
> Вы не может просто вызвать метод ГетВэлью. Вам нужно еще помнить в каком классе-предке он лежит.
А тебе помнить не надо? Тебе еще надо будет помнить в в каком объекте он найдется первым (твоя последовательность). Сам себе противоречишь.

А с рекордсетом у нормальных пацанов - программистов все не так. Есть таблица, в теблице есть записи, в записях есть столбцы, в столбцах - значения в значениях - строки, числа и т. д.
Нах+я моему рекордсету иметь метод stringToValue?
Удалить поделку и не вспоминять!

Там нах не надо никакого наследования. Записи в таблице, объект Коллекция записей содержит ссылку на свою объект таблицу, В колекции записей есть объект запись, который содержит ссылку на свою коллекцию. И т. д. Но не так как у вас. "Я обект - куча, хочешь запрос выполню? На! Хочешь из строки в число? На! Хочешь файл открою? На!"
 
Vijon судя по вам вы остановились в развитии намного раньше подросткового возраста. Вот вы пришли на форум с вопросом и ничего не слушаете, а упорно продожаете страдать херней. А ну и еще мамочку звать "модераторов", смотрите как бы не дозвались.

Так вот уважаемый ху... ой фрилэнсер, качество вашего кода в данном случае будет даже хуже индусятины потому что мало того что вы скрываете прозрачное поведение обилием хитрожопых штучек пытаясь эмулировать свое наследование которое не нужно. Вы не задумывались почему его нету в ЯП? Почему оно есть только в паре языков и то люди не используют их там( нормальные (. Идите дорогуша почитайте Буча, а потом приходите и дальше с умным видом продалжайте тянуть козявку с носа при этом говоря про умные вещи ( как наш презедент в теле дебатах).
 
А тебе помнить не надо? Тебе еще надо будет помнить в в каком объекте он найдется первым (твоя последовательность). Сам себе противоречишь.
Читайте внимательней. Я написал, что коллизий между именами в модулях Рекордсета гарантированно не будет. Значит. и помнить названия модулей мне ни к чему. Я просто напишу АддКолумн, а уж модуль к нему подберется автоматически.

А с рекордсетом у нормальных пацанов - программистов все не так. Есть таблица, в теблице есть записи, в записях есть столбцы, в столбцах - значения в значениях - строки, числа и т. д.
Нах+я моему рекордсету иметь метод stringToValue?
Передайте этим нормальным пацанам, что у Рекордсета должны быть: коллекция столбцов с данными о таблице, сурсе, типе, дефолте, формате... каждого столбца; возможность удаления и добавления строк/столбцов, возможность заполнения из БД; возможность поиска, фильтрации и селекции; возможность конвертирования в клиентский строчный формат и из серверного строчного формата и т. д. и т. п... И если у Ваших нормальных пацанов всего этого нет, посоветуйте им сменить профессию.

А лично Вы еще раз перечитайте мои слова про решения, опробованные практикой.
 
Vijon
Это не множественное наследование в яваскрипте - это ананизм
Можно расширить объект (наделить свойствами и методами)
PHP:
function extend (o, e) {
    for (var i in e)
    o [i] = e;
}
var wheel = new Wheel ();
extend (wheel, new Tire ());
extend (wheel, new Disk ());
Про наследование в js можно почитать в Куроводстве Димы Котерова http://dklab.ru/chicken/nablas/40.html
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху