2014-09-08 2 views
0

Есть ли общий класс предков в pl/sql?PL/SQL: Любой общий класс предков?

Например, в Java класс "Объект" является общим предком для всех классов:

Object o; 
o = new String("hi ancestor");   // a String is an Object 

Но в PL/SQL, мы не можем сказать:

o Object;        // Object class doesn't exist 
o := new myclass('hi ancestor'); 

Обновление: вопрос был более теоретическим, чем практический, просто чтобы узнать, имеет ли класс pl/sql общий класс предков (root) для всех классов, так как я ничего не нашел в нем в документации. Ответы подтвердили, что не существует такого общего класса. Во всяком случае, я приведу несколько примеров того, как имитировать общий корневой класс, основываясь на суждениях ответов.

Способ сделать это трюк, данный Алексом, с использованием типа anydata, который имитирует кастинг для общего класса. Может быть полезно ввести любой класс в качестве параметра в функции. Пример использования:

create or replace type cla as object -- class 
(
    name varchar2(50) 
); 


declare 
    co cla;   -- cla class object 
    co2 cla;   -- another one 
    o anydata;  -- Object class simulation object 
    ok pls_integer; -- to take value returned by the re-cast 
begin 
    co := new cla('hi');    -- create cla object 
    o := anydata.convertobject(co);  -- cast to anydata (not automatic) 
    ok := anydata.getobject(o, co2); -- re-cast to cla 

    dbms_output.put_line('co.name: ' || co.name); 
    dbms_output.put_line('co2.name: ' || co2.name); 
end; 

Другой способ, предложенный user272735, чтобы имитировать общий корень класс, создав класс, который будет родителем всех ваших корневых классов. Например:

create or replace type obj as object -- Object class simulation 
(
    oid varchar2(1000) 
) 
not final; 

create or replace type cla1 under obj -- explicit inheritance 
(
    name varchar2(50) 
); 

create or replace type cla2 under obj -- explicit inheritance 
(
    money number(6) 
); 


declare 
    o1 cla1;  -- cla1 class object 
    o1b cla1;  -- another one 
    o2 cla2;  -- cla2 class object 
    o2b cla2;  -- another one 
    o obj;  -- common ancestor 
begin 
    o1 := new cla1('1', 'hi');   -- create cla1 object 
    o := o1;       -- cast to obj (automatic) 
    o1b := treat(o as cla1);   -- re-cast to cla1 

    dbms_output.put_line('o1.name: ' || o1.name); 
    dbms_output.put_line('o1b.name: ' || o1b.name); 

    o2 := new cla2('2', 222);   -- create cla2 object 
    o := o2;       -- cast to obj (automatic) 
    o2b := treat(o as cla2);   -- re-cast to cla2 

    dbms_output.put_line('o2.money: ' || o2.money); 
    dbms_output.put_line('o2b.money: ' || o2b.money); 
end; 
+0

номера PL/SQL объектная модель не имеет такого корневого класса иерархии классов, как Java 'java.lang.Object'. Вы должны построить его самостоятельно, если вам это нужно. – user272735

+0

См. [Здесь] (http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm#ADOBJ002) для документов Oracle по объектно-реляционному кодированию. – tbone

+0

@tbone спасибо, я уже знал эту страницу :-) – freesoft

ответ

3

Я так не верю в смысл Java. Вы можете сортировать получить что-то подобное с немного ANYDATA:

declare 
    o anydata; 
begin 
    o := anydata.convertobject(myclass('hi ancestor')); 
end; 
/

Вы можете прочитать более here, или, конечно, в documentation, но это не есть много примеров. Tom Kytes has talked about it too.

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

+0

Ну, я изучаю возможности PL PL/SQL, и мне просто интересно, как реализованы некоторые вещи, которые существуют на других языках оо, или как они могут быть реализованы. Трюк anydata выглядит интересным и может быть полезным в некоторых случаях. Во всяком случае, я искал общий класс предков, который можно было бы использовать с помощью полиморфизма (например, для назначения переменных, для передачи параметров, для запуска стандартных методов и т. Д.). – freesoft

+0

@freesoft - вы можете передавать anydata и anytype вокруг; его основной вариант использования представляется как общий параметр. Я не использовал его много, хотя, похоже, не так много примеров. –

+0

Да, я видел примеры, они выглядят сложнее, чем настоящий класс предков. Например, он требует преобразования (кастинг) в обоих направлениях (class-> anydata и anydata-> class), в то время как реальному предку требуется только преобразование родоначальника -> класс (кастинг), а другое - автоматическое (из-за полиморфизма). Кроме того, anydata не имеет никакого метода, поскольку он не является классом, в то время как у реального предка есть методы, общие для всех классов (например, в Java класс Object имеет методы типа clone(), equals(), toString() и т. д.). В любом случае я отмечаю ваше решение как принятое (иногда может быть полезным) – freesoft