为什么使用额外的过程来初始化值而不是在构造函数中执行它?

时间:2015-05-28 12:38:10

标签: oracle oop plsql

所以我在我的新作品中已经开始使用类型了,而且它们几乎都是这样的

create or replace TYPE BODY T_Some_Type AS

  CONSTRUCTOR FUNCTION T_Some_Type
    RETURN SELF AS RESULT AS
  BEGIN
    INTIALIZE();
    RETURN;
  END T_Some_Type;

  MEMBER PROCEDURE INTIALIZE AS
  BEGIN
    var1 := 0;
    var2 := 0;
    var3 := 0;
  END INTIALIZE;
END;

熟练使用OOP但不熟悉pl / sql,我一直在想为什么要使用额外的过程来初始化变量,当它可以直接在构造函数中完成时,使对象界面更简单,更轻松。 这就是我通常会这样做的方式:

create or replace TYPE BODY T_Some_Type AS

  CONSTRUCTOR FUNCTION T_Some_Type
    RETURN SELF AS RESULT AS
  BEGIN
    var1 := 0;
    var2 := 0;
    var3 := 0;

    RETURN;
  END T_Some_Type;
END;

是否有任何优势或出于某种原因推荐这个? 请指教。

1 个答案:

答案 0 :(得分:1)

请记住,自8.0版以来,Oracle中的对象功能发展缓慢,但在某些方面仍然非常有限。这是因为Oracle是一个具有结构化和程序化编程范式的关系数据库:面向对象不适合。

因此。在像Java这样的语言中,我们可以覆盖子类型中的方法,但是通过super()调用在父实现中执行代码。

在11g之前,Oracle没有类似的扩展成员函数的机制。如果我们想要覆盖超类型的方法,我们必须复制子类型中的代码,这非常简单。有一个解决方法,它不是那么简单:将公共代码提取到超类型的单独方法中,并在超类型及其依赖项中调用该方法。

在11g Oracle中引入了“广义调用”。这允许我们在子类型上调用超类型代码。 Find out more。广义调用有一个主要限制,那就是我们不能将它与Constructor方法一起使用。因此,在其子类型的构造函数中,我们唯一的选择是将该代码放在问题中的initialize()方法中。