2016-12-15 10 views
1

多くのプログラミング言語、例えば、 C#では、引数の型をクラスコンストラクタに渡すことができます。抽象スーパークラス用のMatlab OOP型チェック

何かのように:ここ

MyConstructor(IDependencyClass) 

、 'IDependencyClassは' インタフェースです。これにより、依存関係注入とコンポーネントの疎結合を使用できます。

(私の知る限り)MATLABはまた、OOPをサポートしており、それは強く型付けされていない場合でも、またそれは、このようなクラスのインターフェイスとしてのコンセプトを提供しない、私は単純に、私は以下のバリエーションのいずれかを使用することができるだろうと思いました

classdef (Abstract) AbsClass 
    ... 
end 

次に、AbClassへの依存性が存在することになる任意のクラスでは、私はそうのような私有財産を作成し、次のいずれか

properties (Access = private) 

    % The DataModule type is restricted AbsClass. 
    DataModule Core.Modularity.AbsBase 

end 

このプロパティは、建設に設定することができます。

Abstract classes cannot be instantiated. 
Class 'Core.Modularity.AbsClass' defines abstract methods and/or properties 

奇妙なisa(input argument, 'Core.Modularity.AbsBase')

は、MATLABはエラーを投げ、ボールをプレーしたくない:

また、私のようなものを使用して、コンストラクタでのチェックを行うことができます

私にとって、それはちょっと変です...明らかに、Matlabの型チェックメカニズムは、明らかに不可能な抽象クラスのインスタンスを作成したいと考えています。

しかし、中程度から高い複雑さの適切なアプリケーションを設計したい場合、これは大きな欠点です。

私には何が欠けていますか?

EDIT

むしろ愚かな、しかしそれは、ISA()」アプローチが作業を行いますが、のクラスを制限することをまだ少し奇妙ですが、私は確かに "

を省略していることが判明プロパティのアプローチは動作しません:

https://www.mathworks.com/help/matlab/matlab_oop/restrict-class-of-properties.html

答えて

2

問題は、指定されたプロパティのクラスを制限したい場合は、MATLABは、広告を作成する必要があるということですそのクラスの(そのクラスの)プロパティに対して空の値を返すので、emptyメソッドは正常に呼び出される必要がありますが(Core.Modularity.AbsClass.empty())、抽象クラスなのでこれはできません。

はそうしようとすると、このエラーが発生:今

When restricting the class of a property value, the property must be restricted to a concrete class. Replace abstract class 'Core.Modularity.AbsBase' in the definition of property 'DataModule' in class 'MyClass'.

技術的にyou can use the old (and undocumented) syntax for restricting the class of a propertyと明らかにそれは我々がDataModuleを調べるならば、それは実際には、

classdef MyClass 
    properties 
     [email protected] 
    end 
end 

不思議な作品0 x 0Core.Modularity.AbsClassのインスタンス。

inst = MyClass() 
class(inst.DataModule) 
% Core.Modularity.AbsClass 

size(inst.DataModule) 
% 0 0 

別のオプションは、所与の入力引数の型を強制するisaを使用することです。 isaへの2番目の入力は、MATLABが抽象クラスをインスタンス化しようとしているのと同じ問題がないように文字列でなければならないことに注意してください。それは[モジュラーアプリケーション開発]の基本的な局面(https://en.wikipedia.org/wiki/Modular_programming)または[インターフェイスベースのプログラミング]であるので、私はこれを行うことができる必要がある理由は

classdef MyClass < handle 
    methods 
     function self = MyClass(cls) 
      disp(isa(cls, 'Core.Modularity.AbsClass')) 
     end 
    end 
end 
+0

(https://en.wikipedia.org/wiki/Interface-based_programming)。私は私の消費するクラスに注入するものは、必要な機能を提供するので、私は理想的には特定の依存関係を期待する消費クラスを設計することを保証する必要があります。 – Kris

+0

ところで、特定の基本型私がしたいこと... – Kris

+0

@Krisそれでは、私が言いましたように 'isa'を使ってください。 – Suever

関連する問題