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

Статус
В этой теме нельзя размещать новые ответы.

dimagolov

Новичок
очень интересно стало, что Vijon ожидает получить через метод Пэрент Колеса которое есть наследник Резины и Диска одновременно?
 

Vijon

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

PHP:
$this->Parent("Disk", "Width");
то он возвращает мне ширину Диска.

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

PHP:
$this->Width;
возвращается ширина Резины, она же - ширина Колеса.
 

dimagolov

Новичок
Vijon, а почему ширина колеса это ширина Резины а не Диска?

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

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

Vijon

Новичок
Храку.

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

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

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

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

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

-~{}~ 18.12.08 16:21:

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

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

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

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

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

Angerslave

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

Вообще же тема нужности и ненужности множественного наследия обсосана много раз и врядли умники вроде HraKK'а скажут что-то новое в этой области.
Вообще, имхо, если потребовалось множественное наследование, то это первый звоночек к мысли "стоит сменить язык программирования".
 

dimagolov

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

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

Vijon

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

Для dimagolov

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

serglt

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

Не проще сделать хотябы что то типа
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 можно вынести в отдельный класс, ток конструктор менять. Все бонально и просто :)
 

Vijon

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

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

По поводу того, не проще ли... Я уже писал об этом... Если бы мне подходили тривиальные варианты, я бы не создавал тему.
 

HraKK

Мудак
Команда форума
Вообще, имхо, если потребовалось множественное наследование, то это первый звоночек к мысли "стоит сменить язык программирования".
Стоит подумать над тем что ты делаешь, в 99.9999999999999% ты делаешь просто это не правильно.
 

dimagolov

Новичок
Извините за офтоп, но откуда в JS взялось наследование вообще, не говоря уж о множественном? Там ведь классов нет в принципе, есть объекты и их прототипы только?
 

Angerslave

Новичок
Vijon
Python.

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

Vijon
В PHP множественное наследование без костылей симулируется просто несколькими классами, каждый из которых наследует только один, то есть наследование по цепочке.
Но в любом случае, с наследованием нужно обращаться очень осторожно, при неграмотном обращении оно очень повышает сложность программы.
 

serglt

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

Vijon

Новичок
По поводу Вашего примера.

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

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

-~{}~ 18.12.08 17:13:

Для Angerslave

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

Vijon

Новичок
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);
 

serglt

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

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

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

HraKK

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

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

Vijon

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

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

А лично Вы еще раз перечитайте мои слова про решения, опробованные практикой.
 

serglt

Анус, ой, Ахтунг
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
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху