2014-09-08 2 views
0

pl/sql에 공통 조상 클래스가 있습니까? PL/SQL : 공통 조상 클래스?

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이 모든 클래스에 공통 조상 (루트) 클래스를 가지고 있는지를 아는 것보다 실용적인 것보다 더 이론적이었습니다. 문서에서 아무 것도 발견하지 못했기 때문입니다. 응답은 그러한 공통 클래스가 없음을 확인했습니다. 어쨌든, 나는 응답의 sugestions을 기반으로 일반적인 루트 클래스를 시뮬레이트하는 방법에 대한 몇 가지 예제를 제공 할 것입니다.

이를 수행하는 방법은 anydata 유형을 사용하여 Alex가 제공하는 속임수이며, 일반 클래스에 대한 형변환을 시뮬레이트합니다. 함수의 매개 변수로 클래스를 사용하는 것이 유용 할 수 있습니다. 사용의 예 :

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의 java.lang.Object와 같은 클래스 계층 루트 클래스가 없습니다. 필요할 경우 직접 제작해야합니다. – user272735

+0

오브젝트 관계형 코딩에 대한 Oracle 문서는 [here] (http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm#ADOBJ002)를 참조하십시오. – tbone

+0

@tbone 감사합니다. 이미 그 페이지를 알고있었습니다 :-) – freesoft

답변

3

나는 자바 감각으로 그렇게 생각하지 않습니다. 당신은 종류의 ANYDATA와 약간 비슷한 얻을 수 있습니다 :

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

당신은 documentation에서 here 더, 또는 물론 읽을 수 있지만, 많은 예제를 가지고 있지 않습니다. Tom Kytes has talked about it too.

그러나 이전 질문을 주어, 당신은 ...

+0

글쎄요, PL/SQL의 기능을 배우고 있습니다. 다른 언어에 존재하는 것들이 어떻게 구현되는지, 어떻게 구현 될 수 있는지 궁금합니다. anydata 트릭은 재미 있고 일부 경우에 유용 할 수 있습니다. 어쨌든 나는 polimorphically (예를 들어, 변수에 할당, 매개 변수를 전달, 표준 메서드를 실행하는 등) 사용할 수있는 공통 조상 클래스를 찾고 있었다. – freesoft

+0

@freesoft - anydata 및 anytype을 전달할 수 있습니다. 주요 유스 케이스는 일반적인 매개 변수로 보인다. 나는 그것을 많이 사용하지 않았으며 많은 예제가있는 것처럼 보이지 않습니다. –

+0

예, 나는 예를 보았습니다, 그들은 진짜 조상 계급보다 교묘하게 보입니다. 예를 들어, 실제 조상은 조상 -> 클래스 변환 (캐스팅) 만 필요하고 다른 하나는 자동 (polimorphism으로 인해)이지만 양방향 (class-> anydata 및 anydata-> 클래스)으로 변환 (캐스팅)해야합니다. 또한 anydata에는 클래스가 아니기 때문에 아무런 메소드가 없습니다. 실제 조상에는 모든 클래스에 공통적 인 메소드가 있습니다 (예 : Java에서는 Object 클래스에 clone(), equals(), toString() 등). 어쨌든 나는 당신의 솔루션을 받아 들인 것으로 표시하고있다 (때때로 유용 할 수있다). – freesoft

관련 문제