Matlab - 面向对象的抽象接口 - 如何创建对象?

时间:2015-06-18 07:28:03

标签: matlab object

你好可爱的社区,

我在这里很新,但仍希望有人可以帮助我。我过去只是和Matlab一起工作过,想要做一个新项目。之前我只是将所有内容存储在一个Matlab文件中,并且不需要使用类。现在已经改变了,所以我希望有人可以解释我做错了什么。

我的愿望是创建项目对象。因此,我开始在主文件夹中创建新文件夹:

C:\Users\Luftfahrt\MAV\

文件夹名称为:

+Data
+Model

我读完

的第一章后
  

MATLAB定向编程指南

我发现使用加号符号我正在创建公共对象。正如我想要的那样。在每个文件夹中,我为它插入了一个抽象接口和一个子接口。

DataLoaderIF

classdef DataLoaderIF< handle

methods (Abstract=true)
    Data = LoadData(Asset,Start,End)
    Status = getStatus(Obj)
    Info = getInfo(Obj)
end

end

当我运行上面的代码时,他告诉我抽象类无法实例化,但我完全按照书中的说法完成了。也许我想,这是一个抽象界面的愚蠢运行代码,所以没有问题,是真的吗?

DataLoader

classdef DataLoader < DataManager.DataLoaderIF
    %Inheritent from DataLoaderIF. Is setting parameter and Importing

    properties (Access=protected)
        mStatus =-1; %nothing done
        mInfo ='Import'; %
        mData; %saving the imported data
        mCollector; %to save the prices after structuring
    end

    methods  
        %creating the constructor
        function Obj = DataManager

        function getStatus(Obj)

            mStatus=1;
        end

        function getInfo(Obj)

            Info='Import';
            mInfo= Info;
        end

    function LoadData(Asset,Start,End)
        connection = yahoo;
        mData= fetch(connection, Asset, Start,End, 'd');
        close(connection)
        %'JPY=X', '01-Jun-2011', datestr(now,'dd-mmm-yyyy'), 'd');
        mCollector= [{'date' 'open' 'high' 'low' 'close' 'volume' 'adj-close'}
            cellstr(datestr(mData(:,1))) num2cell(mData(:,2:end))];
    end
end

我现在要做的是创建一个Object,然后给这个Object提供变量来执行获取。但是我怎样才能实例化对象呢?他说我的构造函数是假的。

有人有想法吗?

P.S。我已经看过这里Documentation Matlab,但这对我没有帮助。

非常感谢!

1 个答案:

答案 0 :(得分:1)

目前尚不清楚你想要做什么以及为什么你需要一个抽象类然后是派生类,但假设你真的需要所有这些以达到你所描述的更多目的,请考虑以下因素:

  • 根据OOP的定义,抽象类不能实例化。它只是将继承它的不同类的基本框架,您只能实例化这些继承类。只有当不同的继承类表示不同的对象但需要共享一组(几乎)常用方法时,抽象类才有用。如果没有,请忘记“抽象”父级,只需设计满足您需要的类。

  • 请注意从handle类继承的类。在Matlab中,它们的行为与value类不同。阅读this article并确定您想要的类型。

  • 如果您决定使用handle课程,请考虑以下非常重要的因素Initialising property value

  

将属性初始化为唯一值

     

MATLAB仅将属性分配给指定的默认值一次   当MATLAB加载类定义时。因此,如果你初始化一个   使用句柄类构造函数的属性值,MATLAB调用它   构造函数只有一次,每个实例引用相同的句柄   宾语。如果要将属性值初始化为新值   每次创建一个对象时,一个句柄对象的实例,分配   构造函数中的属性值。

现在考虑到所有这些,下面是运行的类的一个版本,您可以实例化如下:

>> dl = DataLoader
dl = 
  DataLoader with no properties.
>> dl.getInfo
ans =
Import
>> dl.getStatus
ans =
    -1
>> dl.LoadData(1,2,3) %// etc ...

课程定义如下

classdef DataLoader < DataLoaderIF

    properties (Access=protected)
        mStatus         %// nothing done
        mInfo           %//
        mData           %// saving the imported data
        mCollector      %// to save the prices after structuring
    end

    methods
        %// Constructor (and initialise default value). For classes which
        %// inherit from the "handle" class it is very important to
        %// intialise your default values IN THE CONSTRUCTOR, and NOT in
        %// the property definition.
        function obj = DataLoader
            obj.mStatus = -1 ;
            obj.mInfo = 'Import' ;
            obj.mData = [] ;
            obj.mCollector = [] ;
        end

        function Status = getStatus(obj)
            Status = obj.mStatus ;
        end

        function Info = getInfo(obj)
            %// a "get" type of function should not assign value, only
            %// return information about the object.
            Info = obj.mInfo ;
        end

        %// the "obj" parameter has to be the first parameter of the
        %// function in it's signature.
        function LoadData(obj,Asset,Start,End)
            %// Put function help here

            %// I don't know what this part of the code is supposed to do
            %// so I leave it as it is. Be aware that the fucntion "fetch"
            %// will have to be accessible in your context or the function
            %// will error
            connection = 'yahoo' ;
            obj.mData = fetch(connection, Asset, Start , End, 'd') ;
            close(connection)
            obj.mCollector= [{'date' 'open' 'high' 'low' 'close' 'volume' 'adj-close'}
                cellstr(datestr(obj.mData(:,1))) num2cell(obj.mData(:,2:end))];

            %// Here do your own test with your own conditions to decide
            %// what the status of the object should be.
            if ~isempty(obj.mData) && ~isempty(obj.mCollector)
                obj.Status = 1 ;
            end

        end
    end
end

你似乎对某些OOP概念感到困惑。如果你第一次与OOP联系是通过Matlab我完全理解你来自哪里。我有同样的经历,多年来我对OOP的理解是错误的(我的OOP代码非常差,结果也很低效),直到我在C++.Net中正确地学习了我的方式。最后两种语言是真正的OOP语言(我知道,不是唯一的语言,甚至更好的语言,我不想开始辩论),因为你需要了解OOP从中获取任何东西的概念。另一方面,你可以用自己的生命在Matlab上做很棒的事情,并且仍然没有意识到甚至OOP意味着什么。

在Matlab中引入了OOP功能,作为错过这种构造代码方式的程序员的“便利”。第一个实现是非常笨重和不实用的(如果你记得必须编写你的每一个 subassignsubsrefdisplay,{举手。每个单个对象{1}},get !! )。从那时起它已经得到了极大的改进,直到它现在值得额外的编码工作,如果你想获得OOP组织的好处(代码重用,多态,继承等......)。然而,到目前为止,即使对于OOP老手,Matlab中的OOP语法仍然是非本能的(为什么我们必须将对象本身声明为函数的第一个参数,编译器是否如此盲目看不到函数是在类定义中吗?)。你必须先习惯它,然后就可以了。 关于OOP的Matlab文档主要面向这些退伍军人。它向那些知道其他语言的OOP的人解释如何在Matlab特定语法中应用这些概念。对于纯粹的初学者来说,它根本不是一个很好的指南。

这个(比我想要的更长,抱歉)模糊,试图解释一下:

  • 如果您需要学习OOP概念,请先使用其他语言训练自己。 (严肃地说,即使学习另一种语言的学习曲线,你将比在Matlab上使用试错方法花费更少的时间)。

  • 如果您在Matlab中没有明确的需要 OOP代码,请不要坚持。您可以在Matlab中做很多事情(事实上几乎所有事情)而不需要诉诸课程(至少不是故意的,当然你会在后台使用基础Matlab课程,但你可以使用和维护你的汽车很多年没有必须对其每个组成部分有深入的了解。)