2017-01-22 49 views
2

我想創建一個抽象類的數組,並在每個數組的元素上調用一些run()方法,該方法引用該類的實現。如何在Matlab中創建一個多態陣列

的東西像Java(原諒語法請,這只是做一個點),代碼將是這樣的:

abstract class Base{ 
    public void run(); 
} 

class Derived0 extends Base{ 
    public void run(){...};//overrides Base's run() method 
} 

class Derived1 extends Base{ 
    public void run(){...};//overrides Base's run() method 
} 

class Derived2 extends Base{ 
    public void run(){...};//overrides Base's run() method 
} 

主:

Base baseArray[3]; 
baseArray[0] = new Derived0(); 
baseArray[1] = new Derived1(); 
baseArray[2] = new Derived2(); 

//runs each possible run() method, without main knowing any of them. 
for(int i=0;i<3;++i){ 
    baseArray.run(); 
} 

我想在matlab中實現這種行爲

我到目前爲止是這個問題的接受答案:

Inheritence Polymorphism In Matlab

我缺乏的是如何使數組baseArray?

baseArray = []這樣的事情導致baseArray(1) = Derived0;預期翻倍,因此失敗。

在matlab中實例化一個Base數組是不可能的,因爲這個類是抽象的,並且沒有實例可以用matlab創建對象數組的方式創建(我知道的)。

所以,請幫助我在Matlab中實現一個多態數組。

我也很感謝python解決方案,儘管Matlab解決方案是最好的。

謝謝!

回答

4

在MATLAB中,如果你用baseArray = []實例化數組,那麼你已經聲明該數組將會是double,所以它不起作用。相反,您可以使用您的類的empty method創建該類的空數組

baseArray = Derived0.empty(); 
baseArray(1) = Derived0(); 

或者,你可以只創建數組一次

baseArray = [Derived0(), Derived0(), Derived0()]; 

另外,如果你想擁有對象的異構陣列,你要確保你的基類也繼承從matlab.mixin.Heterogeneous然後你可以做

baseArray = [Derived0(), Derived1(), Derived2()]; 
+0

不錯!但是 - 如果我想讓我的數組實例化爲固定大小n而不是每次添加元素時都會增長?你的第一種方法使它增長,第二種方法不允許變量大小 – Gulzar

+0

@Gulzar這在MATLAB中是不可能的。有一個預先分配的數組的唯一方法是用* actual *對象填充它,就像在我的第二個示例中那樣,然後用新對象替換它們。你可以創建一個引用數組來引用* same *對象來實例化它。有一些更多的相關信息[這裏](http://stackoverflow.com/questions/35899875/not-enough-input-arguments-error-when-creating-an-array-of-custom-objects/35901096#35901096) – Suever