2013-10-29 84 views
0

我還有一個想法的概念,我有一些麻煩。帶動態方法的類

問題是,這是想創建一個類A,它可以改變它的屬性和方法獨立的系統配置,它可以動態改變。

簡單地說,我可以有一個具有屬性X,Y的類「A1」,只有add方法和另一個具有X,Y,Z的類「A2」以及方法的加減法。並可能在系統內部擁有它們。

但這個想法是,類「A」或更好的類A的對象可以動態地更改爲兩個recebebdo其中的一個方法。

我考慮過使用策略模式,因爲我可以動態更改,但是我卡住了不能動態添加的功能,我讀了一些關於抽象工廠和工廠模式的內容,它「幾乎」滿足我的需求。但我認爲這是因爲我的例子不是很清楚。

我想象的是,這個類將是他們自己的抽象工廠,但這仍然讓我懷疑和他們的新方法。

它不是針對特定的語言,而是我的思想和系統的易用性,而無需管理和使用代碼中的多個類,它將成爲實際類的接口。

最大的問題是:這有可能嗎?我能怎麼做?

例:

class System 
{ 
setConfig(Config.VALUE); 
} 

class A 
{ 
if(system.config == Config.A1) 
{ 
    this.handleClass = new A1(); 
} 
else 
{ 
    this.handleClass = new A2(); 
} 
} 

class A1 
{ 
add(value:float); 
} 

class A1 
{ 
subtract(value:float); 
} 

main 
{ 
System system.setConfig(Config.A); 
A foo = new A(); 

A.add() // because the add method belongs to class A1; 

System system.setConfig(Config.B); 

A.subtract() // because the add method belongs to class A2; 

} 
+0

是的,在C#中可以使用動態和通用接口。在java中,儘管我只知道你可以使用泛型接口。 – Fendy

+0

...使用哪種編程語言? –

+0

它與特定的語言並不完全相關,而是一個「結構性解決方案」,以便於從同一個類開始訪問數據。 – user2347839

回答

0

語言並不明顯。在大多數語言(C++,C#,Java)中,您將返回特定的類型;即使這是「一般」類型,如void *對象,您通常必須知道您可以在編譯時調用哪些方法。解決方法是可能的,但在你的情況下,他們可能不需要。

需要是工廠或抽象工廠模式,我想。你必須弄清楚什麼是所有可能情況下的通用接口(因爲如果函數可以返回int或數組,你不能添加返回的值,也不能獲取它們的元素),並在不同的類中實現這個接口。然後,無論何時需要創建接口實例,都可以請Factory來完成,Factory會選擇它應該是哪個類。

interface ISampleValues{ 
    public abstract int NumberOfValues(); 
    public abstract int SpecificValue(int index); 
} 

class SingleValue : ISampleValues { 
    private int m_value; 
    public SingleValue(int val) {m_value = val;} 
    public override int NumberOfValues() {return 1;} 
    public override int SpecificValue(int index) {return m_value;} 
} 

class ArrayOfValues : ISampleValues { 
    private int[] m_values; 
    public ArrayOfValues(int[] arr) {m_values = arr.Clone();} 
    public override int NumberOfValues() {return m_values.Length;} 
    public override int SpecificValue(int index) {return m_values[index];} 
} 

class ValuesFabric { 
    public ISampleValues GetValues() { 
    if(System.Config.Multiple) 
     return new ArrayOfValues(System.Config.ValuesArray); 
    else 
     return new SingleValue(System.Config.ValuesArray[0]); 
    } 
} 
+0

它與特定的語言並不完全相關,而是一種「結構性解決方案」,以便於從同一個類開始訪問數據。我的想法,並根據系統配置更改「班級」。 非常感謝,但我想我已經想出瞭如何實現我的想法! – user2347839