Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何编写通用函数来操作私有属性?_Oop_Matlab_Properties_Private - Fatal编程技术网

Oop 如何编写通用函数来操作私有属性?

Oop 如何编写通用函数来操作私有属性?,oop,matlab,properties,private,Oop,Matlab,Properties,Private,在Matlab中,我想对类的私有成员执行一些操作。我还想在其他类上执行完全相同的任务。显而易见的解决方案是在一个单独的M文件中编写一个函数,所有类都会调用该文件来执行此任务。然而,在Matlab中这似乎是不可能的(见下文)。有没有其他方法可以做到这一点 具体的问题是:假设我有一个包含内容的m文件 classdef PrivateTest properties (Access=private) a end methods function

在Matlab中,我想对类的私有成员执行一些操作。我还想在其他类上执行完全相同的任务。显而易见的解决方案是在一个单独的M文件中编写一个函数,所有类都会调用该文件来执行此任务。然而,在Matlab中这似乎是不可能的(见下文)。有没有其他方法可以做到这一点

具体的问题是:假设我有一个包含内容的m文件

classdef PrivateTest
    properties (Access=private)
        a
    end

    methods
        function this = directWrite(this, v)
            this.a = v;
        end
        function this = sameFileWrite(this, v)
            this = writePrivate(this, v);
        end
        function this = otherFileWrite(this, v)
            this = otherFileWritePrivate(this, v);
        end
        function print(this)
            disp(this.a);
        end
    end
end

function this = writePrivate(this, v)
    this.a = v;
end
function this = otherFileWritePrivate(this, v)
    this.a = v;
end
…和另一个包含以下内容的m文件

classdef PrivateTest
    properties (Access=private)
        a
    end

    methods
        function this = directWrite(this, v)
            this.a = v;
        end
        function this = sameFileWrite(this, v)
            this = writePrivate(this, v);
        end
        function this = otherFileWrite(this, v)
            this = otherFileWritePrivate(this, v);
        end
        function print(this)
            disp(this.a);
        end
    end
end

function this = writePrivate(this, v)
    this.a = v;
end
function this = otherFileWritePrivate(this, v)
    this.a = v;
end
实例化
p=PrivateTest
后,这两个命令都可以正常工作(如预期的那样):

…但此命令不起作用,即使它是相同的代码,只是在不同的m文件中:

p = p.otherFileWrite(3);
因此,似乎任何对类的私有属性执行操作的代码都必须与定义这些私有属性的classdef位于同一个m文件中。另一种可能是让所有类都用write方法继承一个类,但Matlab也不允许这样做。在一个m文件中,我会有以下代码:

classdef WriteableA
    methods
        function this = inheritWrite(this, v)
            this.a = v;
        end
    end
end
classdef PrivateTestInherit < WriteableA
    properties (Access=private)
        a
    end
end
…在另一个m文件中,我会有以下代码:

classdef WriteableA
    methods
        function this = inheritWrite(this, v)
            this.a = v;
        end
    end
end
classdef PrivateTestInherit < WriteableA
    properties (Access=private)
        a
    end
end
classdef PrivateTestInherit
然而,在实例化
p=PrivateTestInherit之后
,命令p.inheritWrite(4)
会产生与前面相同的错误消息:“不允许设置'PrivateTestInherit'类的'a'属性。”


有鉴于此,如何在Matlab中泛化处理私有属性的代码,还是可能?

不可能在类之外处理私有属性,这就是为什么它们被称为私有属性。这种想法被称为封装

您可以通过多种方式解决此问题:

  • 定义封装私有对象的公共属性,并对其进行更改。(见下面的代码)
  • (继承模式)做一个普通的父类,其他类继承函数


  • 不可能在类之外操纵私有属性,这就是为什么它们被称为私有属性。这种想法被称为封装

    您可以通过多种方式解决此问题:

  • 定义封装私有对象的公共属性,并对其进行更改。(见下面的代码)
  • (继承模式)做一个普通的父类,其他类继承函数


  • 抱歉,我的方法命名混乱。otherFileWritePrivate函数是名为“otherFileWritePrivate.m”的m文件中定义的唯一函数。从
    p=p.otherFileWrite(3)生成的错误消息是“不允许设置“PrivateTest”类的“a”属性”,不是“PrivateTest”类型的输入参数的未定义函数“otherFileWritePrivate”。“[上述注释不再适用]我不尝试在类外操作私有属性;调用外部m文件的是PrivateTest的方法。完全相同的代码在同一个m文件中运行良好,但如果我试图遵循良好的编码实践,将其放在一个单独的m文件中,多个类可以使用相同的代码,那么它就不起作用了。我想保持封装,所以选项1不好。我很确定选项2在Matlab中也是不可能的,但我会更新这个问题,以包括我尝试过的内容。@Ben,我想你会的。你正在做这个。a=v
    其他文件writeprivate.m
    中。从Matlab的角度来看,调用外部函数,将对象传递给它,因此它只能改变它的公共属性,这是根本问题——因为Matlab似乎将不同m文件中的代码视为类的外部,即使该代码是从类内调用的,如何编写通用代码来操作私有属性?答案中的代码将A作为公共依赖属性,这只是将我的私有属性更改为公共属性。它不允许泛化私有属性的操作。对不起,我的方法命名很混乱。otherFileWritePrivate函数是名为“otherFileWritePrivate.m”的m文件中定义的唯一函数。从
    p=p.otherFileWrite(3)生成的错误消息是“不允许设置“PrivateTest”类的“a”属性”,不是“PrivateTest”类型的输入参数的未定义函数“otherFileWritePrivate”。“[上述注释不再适用]我不尝试在类外操作私有属性;调用外部m文件的是PrivateTest的方法。完全相同的代码在同一个m文件中运行良好,但如果我试图遵循良好的编码实践,将其放在一个单独的m文件中,多个类可以使用相同的代码,那么它就不起作用了。我想保持封装,所以选项1不好。我很确定选项2在Matlab中也是不可能的,但我会更新这个问题,以包括我尝试过的内容。@Ben,我想你会的。你正在做这个。a=v
    其他文件writeprivate.m
    中。从Matlab的角度来看,调用外部函数,将对象传递给它,因此它只能改变它的公共属性,这是根本问题——因为Matlab似乎将不同m文件中的代码视为类的外部,即使该代码是从类内调用的,如何编写通用代码来操作私有属性?答案中的代码将A作为公共依赖属性,这只是将我的私有属性更改为公共属性。它不允许对私有属性的操作进行泛化。