对象脚本是否支持多重继承?

时间:2017-08-14 16:19:17

标签: intersystems-cache intersystems objectscript

  

我是新手,可以缓存并找到与普通oop概念不同的东西。在对象脚本中,可以从多个子类继承基类(继承顺序可以是左/右)。如果objectscript是oop,我不知道缓存是如何支持的(不太可能是其他编程语言)。

     

BaseClass的

  Class Inheritance.TheBaseClass Extends (%RegisteredObject, 
  Inheritance.TheChildClass, Inheritance.TheChildClass1) [ Inheritance = left ]
  { 
     ClassMethod Init()
     {
      //do ##class(Inheritance.TheChildClass).Ping()
      //do ##class(Inheritance.TheChildClass1).Ping()
      do ..Ping()
      do ..Pingggg()
      }

   }
  

儿童等级1

 Class Inheritance.TheChildClass Extends %RegisteredObject
 {

   ClassMethod Ping()
   {
        Write "I am in Inheritance.TheChildClass",!
    }

 }
  

儿童班2

Class Inheritance.TheChildClass1 Extends %RegisteredObject
{

  ClassMethod Ping()
  {
    Write "I am in Inheritance.TheChildClass1",!
  }

  ClassMethod Pingggg()
  {
    Write "I am in Inheritance.TheChildClass1111111111",!
   }

  }
  

输出

     

我在继承.ChildClass   

     

我在继承.ChildClass1111111111

1 个答案:

答案 0 :(得分:4)

文档清楚地解释了这一点: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_classes#GOBJ_classes_inheritance

例如,如果类X继承自类A,B和C,则其定义包括:

Class X Extends (A, B, C) 
{
}

类编译器的默认继承顺序是从左到右,这意味着超类中成员定义的差异被解析为有利于最左边的超类(在这种情况下,A取代B和C,B取代C. )

具体来说,对于类X,类参数值,属性和方法的值继承自类A(列出的第一个超类),然后从类B继承,最后从类C继承.X也继承任何来自B的A类未定义的类成员,以及来自C的任何A类和B类都未定义的类成员。如果类B具有与已从A继承的成员同名的类成员,则X使用A中的值;类似地,如果C的成员与从A或B继承的成员具有相同的名称,则优先顺序为A,然后是B,然后是C.