在matlab中创建合理的类构造函数

时间:2014-07-25 11:08:13

标签: matlab oop

假设我们有以下类,我想在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主要部分创建具有特定值的构造函数?我应该使用类的名称吗?提前感谢

2 个答案:

答案 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