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

조회 수: 5 (최근 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 CenterFile Exchange에서 アセンブリ에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!