检查和编辑对象的私有/受保护属性

Posted

技术标签:

【中文标题】检查和编辑对象的私有/受保护属性【英文标题】:Inspecting and editing private/protected properties of objects 【发布时间】:2011-12-12 02:58:25 【问题描述】:

在 MATLAB 2011b 中,我有一些类具有许多私有或受保护的类属性。这是设计使然,因为除了我的班级自己的 getter/setter 之外,我不希望它们可以被其他任何东西查看、读取、写入等。

但是,在开发过程中,有时我想查看这些属性的状态。可以在工作区中检查类对象,但是当我通过双击工作区中的对象访问 变量编辑器 工具时,没有任何私有/受保护属性可见。

我可以理解这可能是设计使然,但我希望有一个我缺少的设置可以让我查看它们。

【问题讨论】:

当一个类正在开发中时,我将所有属性都设置为 public - 我希望能够看到它们。 调试的时候为什么不设置成public呢? 是的,当然设置为公共作品。仅仅为了调试我的代码而被要求这样做似乎是错误的。在其他语言(C、C++ 等)中,调试器对私有/受保护变量毫无疑虑。我只是希望有一个我忽略的方便功能。 @RyanEdwards:事实证明,调试器在查看 Matlab 中的私有/受保护变量时也没有疑虑。 【参考方案1】:

如果您不想修改属性以进行调试,则可以改为使用调试器检查私有/受保护变量。为方便起见,您甚至可以编写一个让您进入调试器的方法,这样您就不必手动设置停止:

classdef testObj_debug
    properties (Access=private)
        p1 = 4;
    end

    methods (Hidden)
        function checkProps(obj)
            keyboard
        end
    end
end

如果您调用to = testObj_debug, to.checkProps,您将访问调试模式,其中隐藏属性p1 是可访问和可检查的。

【讨论】:

使用 checkProps 方法进入对象并四处窥探的绝妙技巧。谢谢。 您是否知道我可以将 checkProps() 方法放入父类并让我的所有类继承它的位置?这将是使用此工具的一种更方便的方法,无需将其添加到我感兴趣的每个类中。 @RyanEdwards:我有两个主要的父类:myHandlemyValue。它们包含我希望每个类都拥有的所有方法。因此,对于句柄类,我写classdef someHandleClass < myHandle,对于someHandleClass 的子类,我写classdef mySub < someHandleClass,一切都会被继承。 @Jonas,我尝试了将checkProps 方法放在基类中并使用派生类继承它的技巧,但似乎基类方法无法访问私有/受保护的成员派生类。据我所知,checkProps 方法必须显式写入您想要使用它的每个类中。这和你的理解不谋而合吗?我正在使用 Matlab 2014b(预发布版)。 @DanielGolden:我有点惊讶您无法从继承的函数中访问这些属性,但只要该方法在您将其复制粘贴到其他类时有效,我想它可以完成这项工作。

以上是关于检查和编辑对象的私有/受保护属性的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用反射类设置私有/受保护的静态属性?

在只读对象属性上编辑 DataGridViewCell

PHP 从静态方法访问对象的受保护属性

向某些类公开受保护/私有属性

澄清 Ruby 中“私有”和“受保护”的定义?

将属性置于受保护/私有的任何性能原因?