2012-03-29 14 views
3

私が書いているMATLABクラスでは、コンストラクタに0引数が与えられた場合、ユーザはuigetfileを使ってファイルを提供するように求められます。ユーザーがプロンプトをキャンセルした場合、は0を返します。その場合、オブジェクトを作成する意味がありません。例外をスローせずにオブジェクトの構造を取り消す方法はありますか?私が早期復帰を行うと、私は使用できない不正なオブジェクトを取得します。コンストラクタでuigetfileを使用して行うには正しいことであるならば、私はわからないよしかしMATLABオブジェクトの作成を例外なしでキャンセルしますか?

classdef MyClass 
    methods 
     function self = MyClass(filename) 
      if nargin == 0 
       filename = uigetfile; 
       if filename == 0 
        %cancel construction here 
        return; %I still get a MyClass object with self.filename == [] 
       end 
      end 
      self.filename = filename; 
     end 
    end 

    properties 
     filename; 
    end 
end 

:ここでのコードは次のようになります。たぶんそれは私のコードの別の部分のresposibilityでなければなりません。

+0

私はこのファイルをすべて削除することをお勧めします。 assert(nargin == 1、 'ファイル名を指定する必要があります!'); – Serg

答えて

5

最近のMatlabオブジェクトでは、構築されたオブジェクトを返すか、エラーをスローすることなくコンストラクタから出ることはできません。 (古いスタイルのクラスでは、実際には、オブジェクトや他の型のプリミティブを含め、必要なものを返すことが許可されていました。そして、あの人は混乱するかもしれません)。コンストラクタが呼び出されると、出力引数は既に初期化されています既定のプロパティ値を持つオブジェクトがあるので、returnを呼び出すと、残りの初期化はスキップされ、オブジェクトが返されます。 MyClassオブジェクト以外のもので置き換えようとすると、エラーになります。

最後に推測しているように、コントロールフローを再構築してGUIコードをコンストラクタから引き出します。それをコンストラクタに混在させると、特に条件付きで問題が発生する可能性があります。特に、Matlabは配列の展開中に要素を埋め込むときにゼロ引数が暗黙的に呼び出されるため、zero-argコンストラクタが常にデフォルト値のあるスカラーオブジェクトを返すことを期待しています。基本的にプロトタイプとして使用されています。

+0

コンストラクタREQUIREを良いファイル名にして、条件付きのものを外に置いてください。標準化したい場合は、静的ファクトリメソッドに入れることができます。 – Marc

+0

MATLABオブジェクトがどのように構築されるか興味深いものです。他の人たちもお伝えしているように、私はコンストラクタからユーザーの介入を取り除きました。それはまた私のコードsignificantlzをより簡単にする – AE426082

関連する問題