2010-05-23 4 views
0

Привет, я воспитываю себя в принципах. Я хотел бы знать, является ли это правильным примером определения Cardellis parametric polymorphism. Пожалуйста, просветите меня.
Пример приведен в синтаксисе на основе скрипта cfml.Является ли это примером параметрического полиморфизма?

<cfscript> 
Parent = createobject("component","webapp.model.Parent").init(); 
Child = createobject("component","webapp.model.Child").init(); 
GrandChild = createobject("component","webapp.model.GrandChild").init(); 
Test = createobject("component","webapp.model.DealWithObject"); 
dump(Test.getNumberOfParents(Parent)); 
dump(Test.getNumberOfParents(Child)); 
dump(Test.getNumberOfParents(GrandChild)); 
</cfscript> 

<cfcomponent> 
<cfscript> 
// should deal with an infinte number of abstract data types (because of common structure) 
public numeric function getNumberOfParents(component arg){ 
    return -1 + arraylen(structfindkey(getmetadata(arguments.arg),"extends","all")); 
} 
</cfscript> 
</cfcomponent> 
+4

Был ли этот код найден на Daily WTF? – Will

ответ

1

Нет, просто (и по принципу замещения, это подтипы.) нет.

Полиморфизм означает, что вам не нужно проверять, что это за тип, вы просто используете его.

Примером может быть (C#):

public Boolean AreEqual(Object o1, Object o2) 
{ 
    return o1.Equals(o2); 
} 

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

+0

да, осознал это сам, я изменил пример – mrt181

1

Я не считаю, что это С., поскольку функция явно имеем дело с типом any аргумента. Точка pp состоит в том, что функция работает независимо от типа объекта.

Если я введу новый тип в систему, эта функция сломается, так как у нее нет специальной обработки.

EDIT: Я думаю, что ваш обновленный пример является подтип полиморфизм, так как функция будет обрабатывать объект и любой из его подтипов, в силу, что GetMetadata обрабатывает объект

+0

Да, я перечитываю статью Карделли. Я предполагаю, что мой пример плох, потому что я использую примитивные и абстрактные типы данных. Я переработаю его. – mrt181

+0

Проблема не в примитивных типах данных. Всякий раз, когда вы начинаете писать код, который проверяет, прошел ли передаваемый объект типа Foo/Bar/Что бы вы ни остановили и попытались найти другое решение (есть некоторые особые случаи, в которых это было бы необходимо, но это очень, очень редко, т.е. сериализация и ORM требуют этих проверок внутренне). – dbemerlin

+0

Итак, обновленный пример работает как pp? – mrt181