1

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

基类

  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",!
   }

  }

输出

我在 Inheritance.TheChildClass

我在继承.TheChildClass1111111111

4

1 回答 1

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 还继承自A 未定义的 B,以及 A 和 B 均未定义的 C 中的任何类成员。如果类 B 有一个与已经从 A 继承的成员同名的类成员,则 X 使用来自 A 的值;同样,如果 C 有一个与从 A 或 B 继承的成员同名的成员,则优先顺序是 A,然后是 B,然后是 C。

于 2017-08-16T08:25:48.890 回答