假设我们有以下类,我想在matlab中声明有理数字类,我是matlab语言中面向对象编程的初学者,我想学习基础知识
classdef ratnum %rational number class
properties (Access=protected)
n %numerator
d %denomerator
end
methods
function r=ratnum(numerator,denomenator)
r.n=numerator;
r.d=denomenator;
end
end
end
如何在matlab主要部分创建具有特定值的构造函数?我应该使用类的名称吗?提前感谢
答案 0 :(得分:1)
要实例化此类的对象,您可以使用:num1 = ratnum(2,3)
由于MATLAB没有基于传递输入量的方法重载,您可以使用nargin
选择正确的方案,如下所示:
classdef ratnum %rational number class
properties (Access=protected)
n %//numerator
d %//denominator
end
methods
function r = ratnum(numerator,denominator)
switch nargin
case 2
r.n=numerator;
r.d=denominator;
case 0
%//whatever you want the defaults to be
end
end
end
end
一个简单的调试技巧是num1_str=struct(num1)
,它允许您查看对象的内容。但是,您应该创建一些公共方法来获取值(而不是每次都将对象转换为struct
。)
要重载MATLAB的默认求和,您需要了解每当您编写a+b
时,它都会自动转换为plus(a,b)
。在使用自定义求和定义自定义类时,您应该创建一个名为@classname
的文件夹(在您的情况下为@ratnum
)并在其中:
ratnum.m
:类定义文件(您编写的代码)plus.m
的文件,其外观如下:
function sum = plus(ratnum1,ratnum2)
ratnum1 = ratnum(ratnum1);
ratnum2 = ratnum(ratnum2);
sum = (...
ratnum1.r*ratnum2.d + ...
ratnum2.r*ratnum1.d )/ ...
(ratnum1.d * ratnum2.d);
end
然后,当您使用+
添加ratnum
时,它将使用正确的加号函数。
以下是一些有用的阅读材料:MATLAB Documntation: Implementing Operators for Your Class
要调用类方法,即使是在其他类方法中,也必须始终首先编写类名:ratnum.sum(ratnum1)。这是一个例子:
classdef ratnum %rational number class
properties (Access=public)
n %//numerator
d %//denominator
end
methods (Access = public)
function r = ratnum(numerator,denominator)
switch nargin
case 2
r.n=numerator;
r.d=denominator;
case 0
%whatever you want the defaults to be
end
end
end
methods (Access = public, Static)
function out = sum(ratnum)
out = ratnum.n + ratnum.d;
end
end
end
然后:
>> a = ratnum(1,1)
a =
ratnum with properties:
n: 1
d: 1
>> ratnum.sum(a)
ans =
2
答案 1 :(得分:0)
如果要使用许多不同的表单重载构造函数,则必须使用默认值初始化缺少的参数(或使用varargin
进行更复杂的重载):
function [r] = ratnum(num, den, varargin)
% Showing initializing missing parameters
if (nargin < 2), den = 42; end
if (nargin < 1), num = 7; end
% Showing working with varargin
if (nargin == 3)
...
elseif((nargin > 1) && (ischar(varargin{1}))
...
else
...
end
end
如果您想创建命名的初始值设定项以澄清其含义,则必须使用Static
方法执行此操作:
methods (Static)
function [r] = TwoThird()
r = ratnum(2, 3);
end
function [r] = Half()
r = ratnum(1, 2);
end
end
可以这样使用:
dummy = ratnum.Half(); % Ratio is 1/2
dummy = ratnum.TwoThird(); % Ratio is 2/3
dummy = ratnum(42, 666); % Ratio can be any custom one