2012-04-22 29 views
0

我有一個通用的Vector<T>類和一個通用的Matrix<T>類,我想知道是否有兩個類實現接口是一個好主意。Vector和Matrix類的接口?

基本上,我採取兩種算法:AlgorithmA和AlgorithmB,這兩者的表現非常類似的操作(復位,平均...等),但有不同的算法和作用於不同的結構: AlgorithmA使用Vector<double>AlgorithmB用途Matrix<Complex>

設計我到目前爲止有:

abstract class AlgorithmArray 
{ 
    // Operator overloading 
} 

class AlgorithmAArray : AlgorithmArray 
{ 
    private Vector<double> _vector; 

    // Overrides 
} 

class AlgorithmBArray : AlgorithmArray 
{ 
    private Matrix<Complex> _matrix; 

    // Overrides 
} 

我寧願AlgorithmAArrayVector<T>派生並實現接口「IAlgorithmArray」(而不是抽象類)。無論如何,這些算法然後用於模擬兩個位置之間的傳輸/接收:

public class CommunicationParameters 
{ 
     private AlgorithmArray _transmission; 
     private AlgorithmArray _receiving; 

     public void Compute() 
     { 
      if(_transmission != null) 
       _transmission.Compute(); 

      if(_receiving != null)   
       _receiving.Compute() 

     } 
} 

是否有更好的方法來處理我的問題?

注:基類AlgorithmArray重複了許多操作符/克隆...等方法,我覺得這可以避免,也許使用泛型?

謝謝!

回答

1

我會建議做兩個算法類,可以採取任何數據結構作爲參數,並做他們的事情。我沒有看到所有這些OOP繼承的需要,它只是增加了複雜性。

1

接口將允許僅讀取或只寫入向量/矩陣的例程接受期望向量/矩陣類型的子類型或超類型的向量/矩陣。我不確定這通常對矩陣有用,但它對於矢量的一些應用可能很方便。

接口優於類的另一個優點,可能更適用於您的情況,它們可能允許可變,不可變和寫時複製對象之間的順利互操作(後者需要額外的間接級別) 。如果你有很多矢量或者矩陣將會是另一個的副本,但是其中一些最終會被修改,這可能會很有用。方法AsImmutable,AsNewMutableAsPossiblyExistingMutable對此可能是有用的。第一種方法(如果在可變對象上調用)將創建一個新的不可變對象,該對象的內容與調用時其主體的內容匹配,或者(如果調用不可變對象),則簡單地返回其主體。第二個將創建一個新的可變對象,而不管現有對象是可變的還是不可變的。第三種方法會返回它的主體如果可變,或者創建一個新的可變對象;它通常只應用於一個對象的持有者會知道,如果該對象是可變的,它就擁有唯一的引用。

舉例來說,如果我有IReadableVector<Foo>類型的私有字段_thing,我的二傳手可以將其設置爲value.AsImmutable()和我消氣可以返回_thing.AsImmutable()。在調用變異方法之前,我的變異方法會設置_thing = _thing.AsPossiblyExistingMutable()。如果自從我收到_thing以來我沒有試圖改變它,它將是一個不可變的對象(其他對象也可能持有引用)。我第一次改變它,它會被複制到一個新的可變對象。然而,隨後的突變可能會繼續使用相同的可變對象,因爲它永遠不會暴露於任何外部代碼。

PS - 對於IImmutableVector<T>IImmutableMatrix<T>作爲接口存在爭論和反對,而只有ImmutableVector<T>ImmutableMatrix<T>類。一方面,如果它們是接口,那麼可能有一些有用的實現不需要實際存儲所有元素。例如,可以有一個類似AllMatchingVector<T>的類,它繼承IImmutableVector<T>,但只包含一個T和一個表示其長度的數字;其索引getter將簡單地返回該元素,而不管指定的索引,或DiagonalMatrix<T>,它只是對其內容的IImmutableVector<T>T將返回到其他地方;特別是對於大型向量/矩陣,這樣的類可以節省內存。另一方面,沒有辦法確保沒有人用一個實際上不是不可變的類來實現這些接口之一。我個人的感覺是可以使用它的接口。畢竟,很少有人抱怨SortedDictionary<T>將失敗,如果一個類實現IComparable<T>以不產生不可變的排序關係的方式。儘管如此,很多人不同意這樣的概念。