无法在CLIPS消息处理程序中引用继承的插槽

用户名

我有一个抽象类,其中有一个定义的只读插槽,名为storage-size

(defclass digital-media (is-a USER)
    (role abstract)

    (slot storage-size
        (type INTEGER)
        (default -1)
        (access read-only)
        (visibility public)))

我已经将主消息处理程序附加到引用相同storage-size插槽的抽象类中

(defmessage-handler digital-media read-storage primary (?offset ?size)
    (if (or (< ?offset 0) (>= ?offset ?self:storage-size))
        then
        (printout t "Read offset " ?offset " is out of bounds, max storage size is " ?self:storage-size crlf)
        (halt))

    (printout t "Still running for some reason..." crlf))

在创建具体类时,仅当隐式声明继承字段时,它才能按预期工作:

(defclass compact-disk (is-a digital-media)
    (role concrete))

(make-instance my-disk of compact-disk)
(send [my-disk] print)
; [my-disk] of compact-disk
; (storage-size -1)

(send [my-disk] read-storage 128 1024)
; Read offset 128 is out of bounds, max storage size is -1

但是,当我为其提供默认值时,消息处理程序将不起作用:

(defclass compact-disk (is-a digital-media)
    (role concrete)

    (slot storage-size
        (source composite)
        (default 650)))

(make-instance my-disk of compact-disk)
(send [my-disk] print)
; [my-disk] of compact-disk
; (storage-size 650)

(send [my-disk] read-storage 128 1024)
; [MSGPASS3] Static reference to slot storage-size of class digital-media does not apply to [my-disk] of compact-disk
; [ARGACCES5] Function >= expected argument #2 to be of type integer or float
; [PRCCODE4] Execution halted during the actions of message-handler read-storage primary in class digital-media
; FALSE
加里·赖利

我不完全了解其原理,但是当您更改子类的插槽方面时,超类消息处理程序在被子类的实例调用时无法使用该插槽的插槽速记引用。因此,在读取存储处理程序中,您需要将?self:storage-size更改为(发送?self get-storage-size)。

我想这会强制超类的封装。例如,读存储消息处理程序知道?self:storage-size引用必须是整数,并且子类不可能将此插槽的类型重新定义为字符串,然后使用a调用此消息处理程序。包含字符串而不是插槽的整数值的子类实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

消息处理程序中需要引用的全局对象

来自分类Dev

无法使用处理程序中的消息更新UI

来自分类Dev

Aframe组件无法从事件处理程序中引用el

来自分类Dev

如何在Java中处理自引用和继承

来自分类Dev

绘画代码在我的WM_COMMAND消息处理程序中无法正常工作

来自分类Dev

Python 中的 Websocket 消息处理程序

来自分类Dev

在事件处理程序中引用`this` vue组件

来自分类Dev

QQuickItem继承程序中未处理的鼠标事件

来自分类Dev

为什么消息处理程序无法在调试模式下工作?

来自分类Dev

无法在Java程序中获得错误消息

来自分类Dev

SOAP消息处理程序

来自分类Dev

无法处理警报消息

来自分类Dev

在rabbitmq中实现消息处理程序来处理接收到的消息

来自分类Dev

无法在处理程序中访问类变量?

来自分类Dev

信号处理程序无法在python中工作

来自分类Dev

RuntimeException:无法在onPreExecute()中创建处理程序

来自分类Dev

CLIPS deftemplate 错误的插槽类型

来自分类Dev

ATL C ++ BHO中的Javascript消息事件处理程序

来自分类常见问题

Actor消息处理程序中捕获了哪个发件人?

来自分类Dev

在后台线程中运行处理程序消息

来自分类Dev

Actor消息处理程序中捕获了哪个发件人?

来自分类Dev

C ++中的高效消息工厂和处理程序

来自分类Dev

从错误处理程序中获取对Kendo Grid的引用

来自分类Dev

获取事件处理程序中对React组件的引用

来自分类Dev

在委托的“ on”处理程序中是否有对所选元素的引用?

来自分类Dev

JavaScript:使用引用函数时,在偶数处理程序中获取$(this)

来自分类Dev

通过引用在javascript中定义事件处理程序的范围

来自分类Dev

为什么Android Studio在此“活动处理程序”代码中警告处理程序引用泄漏?

来自分类Dev

消息处理程序未激活

Related 相关文章

  1. 1

    消息处理程序中需要引用的全局对象

  2. 2

    无法使用处理程序中的消息更新UI

  3. 3

    Aframe组件无法从事件处理程序中引用el

  4. 4

    如何在Java中处理自引用和继承

  5. 5

    绘画代码在我的WM_COMMAND消息处理程序中无法正常工作

  6. 6

    Python 中的 Websocket 消息处理程序

  7. 7

    在事件处理程序中引用`this` vue组件

  8. 8

    QQuickItem继承程序中未处理的鼠标事件

  9. 9

    为什么消息处理程序无法在调试模式下工作?

  10. 10

    无法在Java程序中获得错误消息

  11. 11

    SOAP消息处理程序

  12. 12

    无法处理警报消息

  13. 13

    在rabbitmq中实现消息处理程序来处理接收到的消息

  14. 14

    无法在处理程序中访问类变量?

  15. 15

    信号处理程序无法在python中工作

  16. 16

    RuntimeException:无法在onPreExecute()中创建处理程序

  17. 17

    CLIPS deftemplate 错误的插槽类型

  18. 18

    ATL C ++ BHO中的Javascript消息事件处理程序

  19. 19

    Actor消息处理程序中捕获了哪个发件人?

  20. 20

    在后台线程中运行处理程序消息

  21. 21

    Actor消息处理程序中捕获了哪个发件人?

  22. 22

    C ++中的高效消息工厂和处理程序

  23. 23

    从错误处理程序中获取对Kendo Grid的引用

  24. 24

    获取事件处理程序中对React组件的引用

  25. 25

    在委托的“ on”处理程序中是否有对所选元素的引用?

  26. 26

    JavaScript:使用引用函数时,在偶数处理程序中获取$(this)

  27. 27

    通过引用在javascript中定义事件处理程序的范围

  28. 28

    为什么Android Studio在此“活动处理程序”代码中警告处理程序引用泄漏?

  29. 29

    消息处理程序未激活

热门标签

归档