MATLAB:OOP 调用不同类的函数

Posted

技术标签:

【中文标题】MATLAB:OOP 调用不同类的函数【英文标题】:MATLAB: OOP Calling Functions from Different Class 【发布时间】:2013-10-01 08:45:29 【问题描述】:

我的目标是设计一个使用 MATLAB OOP 在 MATLAB 中编程的可重用引擎。这是我第一次尝试这样做。我想解决的问题如下:我有一个抽象类cPayoffBase,它定义了未知类型收益的接口。继承cPayoffBase,我有一个具体的类cPayoffCall,它实现了一个看涨期权。现在我定义了另一个类cVanillaDerivs,它接受用户定义的支付对象和执行价格。当我将用户定义的对象传递给cVanillaDerivs 以计算某个数量时,Index exceeds matrix dimensions. 表面出现异常。我会详细提供代码。

cPayoffBase.m

classdef (Abstract) cPayoffBase < handle

    methods (Abstract)
        mfGetPayoff(argSpotPrc)
    end

end

cPayoffCall.m

classdef cPayoffCall < cPayoffBase

    properties (GetAccess = private, SetAccess = private)

        dmStrikePrc

    end

    methods

    function obj = cPayoffCall(argStrikePrc)

        obj.dmStrikePrc = argStrikePrc;

    end

    function rslt = mfGetPayoff(obj, argSpotPrc)

        rslt = max(argSpotPrc - obj.dmStrikePrc, 0.0);

    end

end

cVanillaDerivs.m

classdef cVanillaDerivs

%% Data Members
properties (GetAccess = private, SetAccess = private)
    dmPayoffObj
    dmExpiryDt
end

%% Implementation
methods

    % Constructor
    function obj = cVanillaDerivs(argPayoffObj, argExpiryDt)

        obj.dmPayoffObj = argPayoffObj;
        obj.dmExpiryDt  = argExpiryDt;

    end

    % Member Functions
    function rslt = mfGetExpriyDt(obj)

        rslt = obj.dmExpiryDt;

    end

    function rslt = mfGetDerivPayoff(argSpotPrc)

        rslt = obj.dmPayoffObj(argSpotPrc);

    end
end
end

命令窗口

>> clear classes
>> spot = 100; strike = 50; T = 1;
>> payoffObj = cPayoffCall(strike);
>> typeVanilla = cVanillaDerivs(payoffObj, T);
>> mfGetDerivPayoff(typeVanilla, spot)
Index exceeds matrix dimensions.

Error in cVanillaDerivs/mfGetDerivPayoff (line 37)
            rslt = obj.dmPayoffObj(argSpotPrc);

在 C++ 中,假设我有一个包装类并包装类对象 cPayoffBase,我可以为类 cVanillaDerivs 中的双返回函数 mfGetDerivPayoff(double dmSpotPrc) const 执行类似 return (*dmPayoff)(dmSpotPrc) 的操作。请让我知道我的错误,如果可能的话,我怎样才能在 MATLAB OOP 中像 C++ 一样实现相同的过程。

【问题讨论】:

【参考方案1】:

您正在尝试访问属性dmPayoffObj 的第100 号元素。但是,此属性设置为payOffObj,它不是一个数组。因此错误。

我认为你想要的是返回 dmPayoffObj 的收益。您应该将cVanillaDerivs 类的方法mfGetDerivPayoff 更改如下:

function rslt = mfGetDerivPayoff(argSpotPrc)
    rslt = obj.dmPayoffObj.mfGetPayoff(argSpotPrc);
end

【讨论】:

啊。所以需要. 来调用函数mfGetPayoff() 是需要的。所有这些问题都在写一个很好的答案。谢谢。【参考方案2】:

您的意思是rslt = obj.dmPayoffObj.mfGetPayoff(argSpotPrc); 而不是rslt = obj.dmPayoffObj(argSpotPrc);

【讨论】:

是的,您和@Christian 提供的问题和解决方案有效。谢谢。

以上是关于MATLAB:OOP 调用不同类的函数的主要内容,如果未能解决你的问题,请参考以下文章

第二十三天

ios从不同类调用方法的不同方式[关闭]

替代非OOP编程中的多态?

如何让来自不同类的内联函数相互调用[关闭]

OOP学习的第二次BLOG

oop