【问题标题】:PL/SQL: Any common ancestor class?PL/SQL:任何共同的祖先类?
【发布时间】:2014-09-08 11:29:44
【问题描述】:

pl/sql中有共同的祖先类吗?

例如,在 Java 中,“Object”类是所有类的共同祖先:

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 是否对所有类都有一个共同的祖先(根)类,因为我在文档。回复已经确认没有这样一个共同的班级。无论如何,我将根据响应中的建议给出一些关于如何模拟公共根类的示例。

一种方法是 Alex 给出的技巧,通过使用 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;

【问题讨论】:

  • 没有。 PL/SQL 对象模型没有像Java 的java.lang.Object 这样的类层次根类。如果需要,您必须自己构建它。
  • 有关对象关系编码的 Oracle 文档,请参阅 here
  • @tbone 谢谢,我已经知道那个页面了 :-)
  • @user272735 谢谢,我在示例中使用了您的建议(请参阅问题的更新部分)。

标签: oracle class inheritance plsql ancestor


【解决方案1】:

在 Java 意义上我不这么认为。你可以通过ANYDATA 得到一些类似的东西:

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

您可以阅读更多here,当然也可以在documentation 中阅读,但没有太多示例。 Tom Kytes has talked about it too

但是考虑到您之前的问题,您最好将 Java 类存储在数据库中以通过这些类执行面向对象的工作,或者将其完全移出数据库...

【讨论】:

  • 嗯,我正在学习 PL/SQL 的 oo 功能,我只是好奇其他 oo 语言中存在的一些东西是如何实现的,或者如何实现。 anydata 技巧看起来很有趣,在某些情况下可能很有用。无论如何,我一直在寻找一个可以多态使用的公共祖先类(例如,分配给变量、传递参数、运行标准方法等)。
  • @freesoft - 你可以传递任何数据和任何类型;它的主要用例似乎是作为一个通用参数。不过我用的不多,周围的例子似乎也不多。
  • 是的,我看过这些例子,它们看起来比真正的祖先类更复杂。例如,它需要在两个方向(class->anydata 和 anydata->class)进行转换(转换),而真正的祖先只需要祖先->类转换(转换),另一种是自动的(由于多态性)。此外,anydata 没有任何方法,因为它不是一个类,而真正的祖先具有所有类共有的方法(例如,在 Java 中,Object 类具有诸如 clone()、equals()、 toString() 等)。无论如何,我将您的解决方案标记为已接受(有时会很有用)
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多