Oracle PL/SQL:有公共祖先类吗?

Oracle PL/SQL:有公共祖先类吗?,oracle,class,inheritance,plsql,ancestor,Oracle,Class,Inheritance,Plsql,Ancestor,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中是否有共同的祖先类

例如,在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是否对所有类都有一个共同的祖先(根)类,因为我在文档中没有找到任何关于它的内容。这些答复证实,没有这样一个共同的类别。无论如何,我将给出一些例子,说明如何根据响应中的建议来模拟公共根类

一种方法是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;

从Java的意义上说,我不这么认为。您可以通过
ANYDATA
获得一些类似的信息:

declare
  o anydata;
begin
  o := anydata.convertobject(myclass('hi ancestor'));
end;
/
你可以读更多的书,当然也可以在书中读到,但是没有太多的例子


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

从Java的意义上讲,我不这么认为。您可以通过
ANYDATA
获得一些类似的信息:

declare
  o anydata;
begin
  o := anydata.convertobject(myclass('hi ancestor'));
end;
/
你可以读更多的书,当然也可以在书中读到,但是没有太多的例子


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

从Java的意义上讲,我不这么认为。您可以通过
ANYDATA
获得一些类似的信息:

declare
  o anydata;
begin
  o := anydata.convertobject(myclass('hi ancestor'));
end;
/
你可以读更多的书,当然也可以在书中读到,但是没有太多的例子


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

从Java的意义上讲,我不这么认为。您可以通过
ANYDATA
获得一些类似的信息:

declare
  o anydata;
begin
  o := anydata.convertobject(myclass('hi ancestor'));
end;
/
你可以读更多的书,当然也可以在书中读到,但是没有太多的例子



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

No.PL/SQL对象模型没有像Java的
Java.lang.object
那样的类层次根类。如果需要,您必须自己构建。有关对象关系编码的Oracle文档,请参阅。@t谢谢,我已经知道该页面:-)@user272735谢谢,我在示例中使用了您的建议(请参阅问题的更新部分)。否。PL/SQL对象模型没有像Java的
Java.lang.object
那样的类层次根类。如果需要,您必须自己构建。有关对象关系编码的Oracle文档,请参阅。@t谢谢,我已经知道该页面:-)@user272735谢谢,我在示例中使用了您的建议(请参阅问题的更新部分)。否。PL/SQL对象模型没有像Java的
Java.lang.object
那样的类层次根类。如果需要,您必须自己构建。有关对象关系编码的Oracle文档,请参阅。@t谢谢,我已经知道该页面:-)@user272735谢谢,我在示例中使用了您的建议(请参阅问题的更新部分)。否。PL/SQL对象模型没有像Java的
Java.lang.object
那样的类层次根类。如果需要,您必须自己构建它。有关对象关系编码的Oracle文档,请参阅。@t谢谢,我已经知道该页面:-)@user272735谢谢,我在示例中使用了您的建议(请参阅问题的更新部分)。我正在学习PL/SQL的oo功能,我只是好奇其他oo语言中存在的一些东西是如何实现的,或者是如何实现的。anydata技巧看起来很有趣,在某些情况下很有用。不管怎样,我一直在寻找一个通用的祖先类,它可以被多态地使用(例如,分配给变量、传递参数、运行标准方法等等)。@freesoft-你可以传递任意数据和任意类型;它的主要用例似乎是一个通用参数。虽然我没有太多地使用它,而且周围似乎也没有太多的例子。是的,我看过这些例子,它们看起来比真正的祖先类更复杂。例如,它需要在两个方向(class->anydata和anydata->class)进行转换(强制转换),而真正的祖先只需要祖先->类转换(强制转换),另一个是自动的(由于polimorphism)。此外,anydata没有任何方法,因为它不是一个类,而真正的祖先有所有类都通用的方法(例如,在Java中,对象类有clone()、equals()、toString()等方法)。不管怎样,我正在将您的解决方案标记为已被接受(有时可能很有用)好吧,我正在学习PL/SQL的oo功能,我只是好奇如何实现其他oo语言中存在的一些东西,或者如何实现。anydata技巧看起来很有趣,在某些情况下很有用。不管怎样,我一直在寻找一个通用的祖先类,它可以被多态地使用(例如,分配给变量、传递参数、运行标准方法等等)。@freesoft-你可以传递任意数据和任意类型;它的主要用例似乎是一个通用参数。虽然我没有太多地使用它,而且周围似乎也没有太多的例子。是的,我看过这些例子,它们看起来比真正的祖先类更复杂。例如,它需要在两个方向(class->anydata和anydata->class)进行转换(强制转换),