Есть ли способ, позволяющий объектной функции возвращать переменную без передачи этой переменной в конструкторе? - PullRequest
1 голос
/ 05 апреля 2019

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

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

CREATE OR REPLACE 
  TYPE test_obj IS OBJECT
  ( OBJ_ID NUMBER
  , OBJ_NAME VARCHAR2(30)
  , CONSTRUCTOR FUNCTION test_obj
  ( OBJ_ID   NUMBER
  , OBJ_NAME VARCHAR2)
    RETURN SELF AS RESULT
  , MEMBER FUNCTION GET_OBJ_NAME RETURN VARCHAR2
  , MEMBER PROCEDURE SET_OBJ_NAME
  ( ONAME VARCHAR2)
  , MEMBER FUNCTION GET_NAME RETURN VARCHAR2
  , MEMBER FUNCTION TO_STRING RETURN VARCHAR2)
  INSTANTIABLE NOT FINAL;
  /

CREATE OR REPLACE
   TYPE BODY test_obj IS   
   CONSTRUCTOR FUNCTION test_obj
   ( OBJ_ID NUMBER
   , OBJ_NAME VARCHAR2 )
   RETURN SELF AS RESULT IS
   BEGIN
      self.OBJ_ID := OBJ_ID;
      self.OBJ_NAME := OBJ_NAME;
      RETURN;
   END test_obj;

   MEMBER FUNCTION GET_OBJ_NAME
   RETURN VARCHAR2 IS
   BEGIN
      RETURN OBJ_NAME;
   END GET_OBJ_NAME;

   MEMBER PROCEDURE SET_OBJ_NAME
   (OBJ_NAME VARCHAR2) IS
   BEGIN
      self.OBJ_NAME := OBJ_NAME;
   END SET_OBJ_NAME;

-- This is the function that I need to fix
   MEMBER FUNCTION GET_NAME
   RETURN VARCHAR2 IS
   NAME VARCHAR2(30)
   BEGIN
      RETURN NAME;
   END GET_NAME;

   MEMBER FUNCTION TO_STRING
   RETURN VARCHAR2 IS
   BEGIN
      RETURN '['||self.OBJ_ID||']['||self.OBJ_NAME||']';
   END TO_STRING;
END;
/

Я хочу иметь возможность переопределить функцию GET_NAME в подклассах, но я не хочу передавать переменную NAME, потому что этот тип никогда не получит переменную NAME, подтипы являются единственными, которые получит это. Я не смогу его правильно создать, если мне передадут имя через конструктор.

Любая помощь будет высоко ценится. Спасибо.

...