サブクラスコンストラ​クタでスーパークラス​の引数検証(argu​ments)を継承す​る方法

例えばスーパークラスが以下で定義されているとします.
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
Atsushi Ueno on 20 Apr 2024
なぜ引数の検証を継承する必要があるのでしょうか?サブクラスのコンストラクタでは直接使わず、スーパークラスのコンストラクタに渡す引数をサブクラスで検証する必要はないと思います。
Takumi
Takumi on 20 Apr 2024
Edited: Takumi on 20 Apr 2024
回答ありがとうございます.
検証はスーパークラスで行えばよいのはその通りでそうしたいです.
オプション引数のうち,サブクラスで追加したオプションc以外(今回の場合はn,a,b)をスーパークラスにわたすにはどうしたらよいか,と言い換えられます.苦戦しているのはサブクラスでオプション引数c(及びその検証)だけを追加するにはどのようにしたらよいかという点です.
つまり,
A = SuperClass(0,"a",1,"b",2); % n=0, a=1, b=2の例
B = SubClass(0,"a",1,"b",2,"c",3); % n=0, a=1, b=2, c=3の例
C = SubClass(0,"c",3); % n=0, a=1, b=2, c=3の例
が実行可能なSubClassはどのように作成したらよいか,という質問です.
Atsushi Ueno
Atsushi Ueno on 21 Apr 2024
なるほど理解しました。引数の検証条件は、漏れなく順番通りに書く必要がある様です。
ならば arguments 構文を使わず、properties 構文の中で検証条件やデフォルト値を定義すれば良いのではないでしょうか? 検証条件の文法は下図の様にまったく同じです。前者に出来て後者に出来ない事は何か ⇒ 今回の例なら「サブクラスの種類によっては、スーパークラスのプロパティ検証条件が異なる」場合ですね。
Takumi
Takumi on 21 Apr 2024
コンストラクタの引数にしたかったのは,その引数をコンストラクタ内の処理で使用したかったからなので少し意図と違いましたが,大変勉強になりました.ありがとうございます.properties内での検証に置き換えられそうなときはそうしたいと思います!
Atsushi Ueno
Atsushi Ueno on 22 Apr 2024
arguments 構文はC言語のプロトタイプ宣言と同様、全ての引数について漏れなく順番通りに書く必要がある様です。ところでこの構文は、R2019b で導入された比較的新しい文法です。それより前は誰もが他の方法、例えば assert 関数などを駆使して検証していた訳です。
いっその事、arguments 構文に拘らずにコンストラクタの引数を検証すれば良いのではないでしょうか?あまりスマートな書き方は望めませんが、ルールに拘束されず自由に書く事ができます。

Sign in to comment.

Answers (0)

Products

Release

R2023b

Asked:

on 18 Apr 2024

Commented:

on 22 Apr 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!