【发布时间】:2016-08-02 14:52:40
【问题描述】:
背景
我有不同类型的文件,我从中提取和存储数据,例如 .csv 和数据库文件。它们通常是大文件,我已经有了从中提取数据的适当方法。
期望的行为
让我们以textfile 类为例。我希望能够创建一个 textfile 对象数组,其中每个元素对应一个唯一的文本文件。我希望能够使用单个参数调用textfile,或者根本没有参数。
如果我不传递任何参数,我将被带到一个文件选择屏幕来选择文件,并且将创建一个对象数组,我选择的每个文件都有一个元素。
如果传递了一个参数,我希望根据该参数的内容创建数组。如果是目录路径,请再次打开文件选择屏幕。如果它是文件路径的元胞数组,请创建这些文件的对象数组。
我希望能够轻松创建更多具有相同基本行为的类,例如 textfile。
目前的尝试
我已经定义了一个超类file 来处理所有文件共有的行为。这包括分配诸如filename 和extension 之类的属性。我的其他类都是file的子类。
在file 的构造函数中,我有两个输入参数。我的想法是,在相关的子类构造函数中,我将调用 file 构造函数。第一个输入参数是文件的类型,例如txt,而第二个是我在创建 textfile 数组时选择的参数。为简单起见,假设我希望能够处理的唯一类型的 arg 是从中选择文件的目录路径。
classdef textfile < file
methods
function textfileObject = textfile(arg)
if nargin == 0
arg = '';
end
textfileObject@file('txt',arg);
end
end
file构造函数,根据我创建textfile对象时arg是什么,根据using the No Input Argument Constructor Requirement生成对象数组。
classdef file < handle
properties
Path
end
methods
function FileObject = file(FileType,arg)
if nargin == 2
FileList = file.SelectFiles(FileType,arg);
FileObject(numel(FileList),1) = file;
for filecount = 1:numel(FileObject)
FileObject(filecount,1).Path = FileList{filecount};
end
end
end
end
methods(Static)
function FileList = SelectFiles(DirectoryPath)
% Some selection dialogs. Returns a cell array of filepaths
end
end
end
这在arg 是一个目录时有效,因为当对象数组在textfile 中初始化且没有输入参数时,arg 被设置为'',它适用于其余的构造函数。
但是,我希望在创建 textfile 对象时不能有任何输入参数,但这不适用于构造函数的无输入参数规则。
问题
有没有办法同时创建对象数组
调用超类构造函数并
不使用任何输入参数?
我愿意接受其他解决方案,这些解决方案可以帮助我解决为每种文件类型创建类的问题。
解决方案
事实证明,您可以使用匿名函数从超类调用子类构造函数。实际上,您可以在没有输入参数的情况下调用子类构造函数,然后在使用这些文件名作为输入再次(递归)调用子类之前在超类中生成文件名。谢谢@Suever。
子类构造函数将是:
classdef textfile < file
methods
function textfileObject = textfile(varargin)
textfileObject@file('txt',varargin{:});
end
end
end
在超类中:
classdef file < handle
properties
Path
end
methods
function FileObject = file(FileType,varargin)
% Subclass constructor handle
Constructor = @(FilePath)feval(class(FileObject),FilePath);
% No subclass arguments
if nargin == 1
FileList = file.SelectFiles(FileType,'');
for a = 1:numel(FileList)
FileObject(a,1) = Constructor(FileList{a});
end
% One subclass argument
elseif nargin == 2
arg = varargin{1};
if ischar(arg)
FileStruct = dir(arg);
if numel(FileStruct) == 1
FileObject.Path = arg;
end
end
% Too many subclass arguments
else
error('Subclasses of file only take one or no input arguments');
end
end
end
end
【问题讨论】:
-
那么当您不提供任何输入时,您希望系统提示您选择文件吗?
-
@Suever 是的,当我不提供任何输入时,我想被提示选择文件(默认从工作目录中),然后将创建对象数组,每个元素对应于我选择的文件。
标签: arrays matlab object constructor superclass