MATLAB:OOP调用来自不同类的函数

MATLAB: OOP Calling Functions from Different Class

本文关键字:同类 函数 OOP 调用 MATLAB      更新时间:2023-10-16

我的目标是使用 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++相同的过程。

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

我想你想要的是回报dmPayoffObj的回报。应更改类cVanillaDerivs的方法mfGetDerivPayoff,如下所示:

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

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