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

4 ビュー (過去 30 日間)
Takumi
Takumi 2024 年 4 月 18 日
コメント済み: Atsushi Ueno 2024 年 4 月 22 日
例えばスーパークラスが以下で定義されているとします.
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 件のコメント
Takumi
Takumi 2024 年 4 月 21 日
コンストラクタの引数にしたかったのは,その引数をコンストラクタ内の処理で使用したかったからなので少し意図と違いましたが,大変勉強になりました.ありがとうございます.properties内での検証に置き換えられそうなときはそうしたいと思います!
Atsushi Ueno
Atsushi Ueno 2024 年 4 月 22 日
arguments 構文はC言語のプロトタイプ宣言と同様、全ての引数について漏れなく順番通りに書く必要がある様です。ところでこの構文は、R2019b で導入された比較的新しい文法です。それより前は誰もが他の方法、例えば assert 関数などを駆使して検証していた訳です。
いっその事、arguments 構文に拘らずにコンストラクタの引数を検証すれば良いのではないでしょうか?あまりスマートな書き方は望めませんが、ルールに拘束されず自由に書く事ができます。

サインインしてコメントする。

回答 (0 件)

カテゴリ

Help Center および File Exchangeアセンブリ についてさらに検索

製品


リリース

R2023b

Community Treasure Hunt

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

Start Hunting!