サブクラスコンストラクタでスーパークラスの引数検証(arguments)を継承する方法
Show older comments
例えばスーパークラスが以下で定義されているとします.
classdef SuperClass < handle
properties
n
a
b
end
methods
function obj = SuperClass(n,opt)
arguments
n
opt.a = 1
opt.b = 2
end
obj.n = n;
obj.a = opt.a;
obj.b = opt.b;
end
end
end
上記を継承し,オプション引数(opt)としてパラメータcを追加したサブクラスを作成したいとします.
思い描く理想的な擬似コードは以下です.
classdef SubClass < SuperClass
properties
c
end
methods
function obj = SubClass(n,opt)
arguments
% スーパークラスで行っているn, opt.a,
% opt.bの検証もここで行ってほしい.同じことを記載しないといけないのか?
opt.c = 3
end
% ここでスーパークラスのコンストラクタが呼ばれる??
% n, opt.a, opt.bを引数として受け取り,スーパークラスのコンストラクタをコールしたい.
obj.c = opt.c;
end
end
end
一方で,動作するように改修したSubClassコードは以下です.
classdef SubClass < SuperClass
properties
c
end
methods
function obj = SubClass(n,opt,opt2)
arguments
% スーパークラスで行っている検証をもう一度書きたくない.
% オプションの項目,初期値も含めてスーパークラスの値を継承したい
n
opt.a = 1
opt.b = 2
%%%%%%%%%%%%%
opt2.c = 3
end
% スーパークラスのコンストラクタ
varargin = namedargs2cell(opt);
obj@SuperClass(n,varargin{:});
obj.c = opt2.c;
end
end
end
クラスに関する基本的な理解が乏しくて申し訳ないのですが,質問は以下です.
”理想的な擬似コード”や”改修したSubClassコード”のコメントに記載したように,SubClassの引数検証においてSuperClassですでに記述している引数検証を省略(継承)する方法はありますか?可能な場合どのような方法があるでしょうか.またSuperClassのコンストラクタをどのようにコールすればよろしいでしょうか?
5 Comments
Atsushi Ueno
on 20 Apr 2024
なぜ引数の検証を継承する必要があるのでしょうか?サブクラスのコンストラクタでは直接使わず、スーパークラスのコンストラクタに渡す引数をサブクラスで検証する必要はないと思います。
Atsushi Ueno
on 21 Apr 2024
なるほど理解しました。引数の検証条件は、漏れなく順番通りに書く必要がある様です。
ならば arguments 構文を使わず、properties 構文の中で検証条件やデフォルト値を定義すれば良いのではないでしょうか? 検証条件の文法は下図の様にまったく同じです。前者に出来て後者に出来ない事は何か ⇒ 今回の例なら「サブクラスの種類によっては、スーパークラスのプロパティ検証条件が異なる」場合ですね。

Takumi
on 21 Apr 2024
Atsushi Ueno
on 22 Apr 2024
Answers (0)
Categories
Find more on アセンブリ in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!