例:
我正在做的是使用超类中的map成员函数来使用卷进行比较。我已尝试使用/不覆盖子类中的map函数,但仍然没有运气。如果我创建相同的对象两次但是如果我创建不同的对象,我可以比较。
在下面的示例中,我只粘贴球体,因为球体和金字塔几乎相同。
这是我的超级班:
CREATE OR REPLACE TYPE figure_t AS OBJECT (
v_volume NUMBER,
v_area NUMBER,
MAP MEMBER FUNCTION compare RETURN NUMBER, PRAGMA restrict_references ( compare, wnds, trust )
);
/
CREATE OR REPLACE TYPE BODY figure_t AS
MAP MEMBER FUNCTION compare RETURN NUMBER IS
BEGIN
RETURN v_volume;
END;
END;
/
ALTER TYPE figure_t NOT FINAL
CASCADE;
/
然后,这是我的子类型:
CREATE OR REPLACE TYPE sphere_t UNDER figure_t (
v_radio NUMBER,
CONSTRUCTOR FUNCTION sphere_t (
radio NUMBER
) RETURN SELF AS RESULT,
MEMBER FUNCTION get_volume RETURN NUMBER,
MEMBER FUNCTION get_area RETURN NUMBER,
OVERRIDING MAP MEMBER FUNCTION compare RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY sphere_t AS
CONSTRUCTOR FUNCTION sphere_t (
radio NUMBER
) RETURN SELF AS RESULT IS
BEGIN
self.v_radio := radio;
self.v_volume := ( 4 / 3 ) * 3.141592654 * power(radio, 3);
self.v_area := 4 * 3.141592654 * power(radio, 2);
return;
END;
MEMBER FUNCTION get_volume RETURN NUMBER IS
BEGIN
RETURN v_volume;
END;
MEMBER FUNCTION get_area RETURN NUMBER IS
BEGIN
RETURN v_area;
END;
OVERRIDING
MAP MEMBER FUNCTION compare RETURN NUMBER IS
BEGIN
RETURN self.v_volume;
END;
END;
/
为了进行比较,它看起来像:
DECLARE
sphere_v sphere_t;
pyramid_v pyramid_t;
BEGIN
pyramid_v := pyramid_t(120, 90, 30);
sphere_v := sphere_t(10);
IF ( sphere_v != pyramid_v ) THEN
dbms_output.put_line('NOT EQUAL');
END IF;
END;
应该有一种方法进行比较,因为数字有一个共同的超类。
应该有一种方法进行比较,因为数字有一个共同的超类
我不太确定你想在这里实现什么。还有什么是你在比较中使用的pyramid_t
的定义。
IF(sphere_v!= pyramid_v)然后
上述情况看起来很冒险,因为情况总是如此。
当你做sphere_v := sphere_t(10);
意味着你试图把sphere_t
全部归还给sphere_v
。因此,如果你能分别比较Sphere
和pyramid
的体积和面积,那就太好了。请参阅下面演示如何获取这些值:
DECLARE
sphere_v sphere_t;
-- pyramid_v pyramid_t;
BEGIN
sphere_v := sphere_t(10);
dbms_output.put_line('Input Radio -->'||sphere_v.v_radio);
dbms_output.put_line('Volume of Sphere-->'||sphere_v.v_volume);
dbms_output.put_line('Area Of Sphere -->'||sphere_v.v_area);
--Similarly you can take the values of `volume` and `area`
--of pyramid and get it compared with that of Sphere.
-- pyramid_v := pyramid_t(120, 90, 30);
-- dbms_output.put_line('Input Radio Pyramid -->'||pyramid_v.v_radio);
-- dbms_output.put_line('Volume of Pyramid -->'||pyramid_v.v_volume);
-- dbms_output.put_line('Area Of Pyramid -->'||pyramid_v.v_area);
-- If sphere_v.v_volume = pyramid_v.v_volume then
-- dbms_output.put_line('Equal');
-- Else
-- dbms_output.put_line('Not Equal');
END;
假设:pyramid_t
也具有相同的Object Body定义,具有体积和面积计算。
应该有一种方法进行比较,因为数字有一个共同的超类。
有一种方法,它只是不明显。
当类型完全相同时,例如我们可以隐式调用map函数的两个相同子类的实例。所以我们可以像这样比较两个领域:
IF ( sphere_1 != sphere_2 ) THEN ...
但是,为了比较两个不同的子类型,我们需要调用父映射函数,为了实现这一点,我们必须明确地引用它:
IF ( sphere_v.compare() != pyramid_v.compare() ) THEN ...
是的,这很笨重。但Oracle是一个RDBMS而不是ORDBMS(无论他们在8.0天版本中声称什么)。