假设我们有以下课程,我想在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主要部分中创建具有特定值的构造函数?我应该使用类的名称吗?谢谢
(对我而言)您的问题尚不清楚。 您要初始化单个对象,还是要为所有对象使用默认的初始化程序? 还是只是问问如何在运行时创建此类的对象?
这个Ratnum类就是单个对象
num1 = ratnum(2,3)num1 =没有属性的ratnum。
我不知道在哪里写函数,如何使用它
要实例化此类的对象,可以使用: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时,它将使用正确的plus函数。
这里有一些有用的读物??:MATLAB文档:为您的课程实施运算符
要调用类方法,即使从其他类方法中调用,也必须始终首先编写类名称: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
我相信代码示例可以说明一切。
如果我不使用静态?
@datodatuashvili如果您还有其他问题,请作为问题提问。 在评论中提出更多问题的建议不予受理; 特别是如果您只希望有人给您代码。
我不想有人给我代码,我可以做同样的事情,我只需要一些基本的东西
不使用此特定方法Static仍然可以工作,但从OOP角度来看是不正确的。 看到这个:stackoverflow.com/questions/2713601/
好的,非常感谢
如果要以许多不同的形式重载构造函数,则必须使用默认值初始化缺少的参数(或对于更复杂的重载使用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
您能否在哪里添加一些功能进行更新?例如,我想添加两个数字