背景
私は、たとえば.csvファイルとデータベースファイルからデータを抽出して保存するさまざまなタイプのファイルを持っています。それらは通常大容量ファイルであり、私はすでにそれらからデータを抽出するための適切な方法を持っています。入力引数のないオブジェクト配列を作成する
望ましい行動
のは、一例として、クラスtextfile
を使用してみましょう。私はtextfile
オブジェクトの配列を作成することができたいと思います。各要素は一意のテキストファイルに対応しています。 1つの引数でtextfile
に電話することができます。には引数が全くありません。です。私は何も引数を渡さない場合
、私はファイルを選択するには、ファイル選択画面に移動します、とオブジェクトの配列が作成され、私が選択した各ファイルに1つの要素。
1つの引数が渡された場合、その引数が何であったかによって、配列を作成したいと思います。ディレクトリパスの場合は、ファイル選択画面を再度開きます。それがファイルパスのセル配列だった場合は、それらのファイルのオブジェクト配列を作成します。
同じ基本動作を持つtextfile
のようなクラスを簡単に作成したいと考えています。
試み、これまで
私はすべてのファイルに共通する行動の世話をするためにスーパークラスfile
を定義しました。これには、filename
やextension
などのプロパティの割り当てなどが含まれます。私の他のクラスはすべてfile
のサブクラスです。
file
のコンストラクタには、2つの入力引数があります。私の考えは、関連するサブクラスのコンストラクタではfile
というコンストラクタを呼び出すことでした。最初の入力引数はファイルのタイプです。 txt
、textfile
配列を作成するときに選択した2番目の引数があります。わかりやすくするために、arg
の唯一のタイプは、どこからファイルを選択するかのディレクトリパスです。何arg
に応じ
classdef textfile < file
methods
function textfileObject = textfile(arg)
if nargin == 0
arg = '';
end
[email protected]('txt',arg);
end
end
file
コンストラクタは、私はtextfile
オブジェクトを作成するとき、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
オブジェクトアレイはない入力引数とtextfile
にinitalizedされた場合、arg
がコンストラクタの残りの部分で動作''
に設定されているためarg
が、ディレクトリである場合、この作品。
しかし、私はtextfile
オブジェクトを作成するときに入力引数を持たないことができますが、コンストラクタの入力引数なしルールでは機能しません。
質問
は、スーパークラスのコンストラクタと
任意の入力引数を使用していないの呼び出し中にオブジェクトの配列を作成する方法はありますか?
私のファイルタイプごとにクラスを作成するのに役立つ他の解決策があります。
ソリューション
それはあなたが匿名関数を使用してスーパークラスからサブクラスのコンストラクタを呼び出すことができ判明。実際には、入力引数を持たないサブクラスコンストラクタを呼び出してから、入力としてこれらのファイル名で(再帰的に)サブクラスを呼び出す前に、スーパークラスでファイル名を生成することができます。ありがとう@Suever。
サブクラスのコンストラクタは、単純に次のようになります。
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
file
スーパークラスの中からあなたを正しいサブクラスのコンストラクタを呼び出すと、次のようなものであることを再帰呼び出しを変更することができます入力を提供しないときにファイルを選択するよう求められますか? – Suever@Suever入力を提供しない場合、デフォルトで作業ディレクトリからファイルを選択するように求められ、オブジェクト配列は選択したファイルに対応する各要素とともに作成されます。 – jenszvs