我正在尝试在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++不同,每个文件只能定义一个方法。结果真的是一团糟。
另请参阅:
- 代码折叠--展开和折叠代码结构
- 编辑器/调试器代码折叠首选项