oop matlab,关于oop:在Matlab中创建理性的类构造函数

假设我们有以下课程,我想在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

您能否在哪里添加一些功能进行更新?例如,我想添加两个数字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值