Matlab以一种优雅的OOP方式定义类函数



我正在尝试在Matlab OOP中实现一个小示例函数。

功能代码为:

classdef Cat < handle
properties
    meowCount = 0; 
end
methods 
    function obj = Cat()            % all initializations, calls to base class, etc. here,
    end
    function Meow(obj)
        disp('meowww'); 
        obj.meowCount = obj.meowCount + 1;
    end
end    
end

我想创建类似于C++的以下类型的东西,因为我在现实生活中的函数定义非常大,我不想混淆我的类定义:

classdef Cat < handle
properties
    meowCount = 0; 
end
methods 
    function obj = Cat()            % all initializations, calls to base class, etc. here,
    end
    function Meow(obj);
end    
end

%%
function Cat::Meow(obj)
   disp('meowww'); 
   obj.meowCount = obj.meowCount + 1;
end

所以,基本上是在类外编写函数Meow的定义。如何完成上述更改?

要玩工作的第一个版本,您可以使用以下内容:

C = Cat;
C.meowCount
C.Meow

创建一个名为@Cat的文件夹。

@Cat内,放入以下文件:

类别m

classdef Cat < handle
    properties
        meowCount = 0; 
    end
    methods 
        function obj = Cat()
        end
        Meow(obj) % this is optional, and just indicates the function signature
    end    
end

Meow.m

function Meow(obj)
    disp('meowww'); 
    obj.meowCount = obj.meowCount + 1;
end

移出@Cat文件夹,并确保它(或其父文件夹)在您的路径上。然后试试你的例子。

如果像这样使用@文件夹来包含类,则大多数方法(虽然不是构造函数,也不是属性get/set方法)都可以移动到外部文件中。

如果需要,可以在主classdef文件中包含一个没有实现的函数签名。这有时是可选的,但如果您希望将方法的访问级别从默认级别更改为其他级别,则这是必要的。

定义类的方法有两种方法。更新、更可移植的方法是在同一个classdef文件中定义它们。您也可以将方法编写为单独的M-文件函数,并将它们放在@MyClass文件夹中。请注意,某些方法必须在classdef文件中。您仍然可以通过helper函数将单独的文件方法定义为静态和私有。这有点像黑客,这就是为什么把所有东西都放在classdef文件中是个好主意,除非你有一个非常大的项目。

处理classdef文件中混乱的最好方法是使用代码折叠。可以折叠单个方法和整个方法块。通过这种方式,您可以通过在同一个方法块中将相关方法分组在一起,轻松地将classdef文件组织得尽可能整洁。折叠您当时没有使用的任何方法/块。

此外,您可以使用编辑器功能区选项卡中的"转到"按钮来选择要查看的特定方法(如果它们都在同一文件中定义)。

一开始,在单独的文件中编写方法似乎是一个很好的解决方案,但如果你有一个包含许多方法的类,那么同时打开许多文件会变得非常麻烦。与C++不同,每个文件只能定义一个方法。结果真的是一团糟。

另请参阅:

  • 代码折叠--展开和折叠代码结构
  • 编辑器/调试器代码折叠首选项

最新更新