0

我有一个泛型Vector<T>类和一个泛型Matrix<T>类,我想知道让两个类都实现一个接口是否是个好主意。

基本上,我正在实现两种算法:AlgorithmA 和 AlgorithmB,它们都执行非常相似的操作(重置、平均...等),但使用不同的算法并作用于不同的结构: AlgorithmA使用Vector<double>while AlgorithmBuses Matrix<Complex>

我到目前为止的设计:

abstract class AlgorithmArray
{
   // Operator overloading
}

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

    // Overrides
}

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

     // Overrides
}

我宁愿从接口AlgorithmAArray派生Vector<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复制了许多操作符/克隆...等方法,我觉得这可以避免,也许使用泛型?

谢谢 !

4

2 回答 2

1

接口将允许仅读取或仅写入向量/矩阵的例程接受预期向量/矩阵类型的子类型或超类型的向量/矩阵。我不确定这通常对矩阵有用,但它对于向量的某些应用可能很方便。

与类相比,接口的另一个优势可能更适用于您的情况,即它们可以允许可变、不可变和写时复制对象之间的平滑互操作(后者需要额外的间接级别)。如果您有很多向量或矩阵将成为彼此的副本,但其中一些最终会被修改,这可能会很有用。方法AsImmutable,AsNewMutableAsPossiblyExistingMutable可能对此有用。第一个方法(如果在可变对象上调用)将创建一个新的不可变对象,其内容与调用时其主体的内容匹配,或者(如果在不可变对象上调用)对象,只需返回其主体。第二个将创建一个新的可变对象,无论现有对象是可变的还是不可变的。第三种方法如果可变则返回其主题,否则创建一个新的可变对象;它通常只应用于对象的持有者知道,如果对象是可变的,它拥有唯一的引用的情况。

例如,如果我有一个_thingtype的私有字段IReadableVector<Foo>,我的 setter 可以将它设置为,value.AsImmutable()而我的 getter 可以 return _thing.AsImmutable()。我的变异方法会_thing = _thing.AsPossiblyExistingMutable()在调用变异方法之前设置。如果我在收到它后没有尝试进行变异_thing,那么它将是一个不可变对象(其他对象也可能持有对它的引用)。我第一次改变它时,它会被复制到一个新的可变对象中。然而,随后的突变可以继续使用相同的可变对象,因为它永远不会暴露给任何外部代码。

PS-- 支持和反对将IImmutableVector<T>andIImmutableMatrix<T>作为接口,而不是仅具有ImmutableVector<T>ImmutableMatrix<T>类。一方面,如果它们是接口,则可能有不需要实际存储所有元素的有用实现。例如,一个类AllMatchingVector<T>可以继承IImmutableVector<T>,但只包含一个T和一个表示其长度的数字;它的索引 getter 将简单地返回该元素,而不管指定的索引是什么,或者DiagonalMatrix<T>它只是IImmutableVector<T>为其对角线的内容保存一个T将在其他任何地方退回;特别是对于大型向量/矩阵,这样的类可以节省内存。另一方面,没有办法确保没有人使用实际上不是不可变的类来实现这些接口中的一个。我个人的感觉是,为此使用接口很好。毕竟,很少有人抱怨SortedDictionary<T>如果一个类IComparable<T>以不产生不可变排序关系的方式实现会失败。尽管如此,很多人不同意这样的概念。

于 2012-04-23T16:09:02.253 回答
1

我建议制作两个可以将任何数据结构作为参数并执行其操作的算法类。我认为不需要所有这些 OOP 继承,它只会增加复杂性。

于 2012-04-22T16:12:42.690 回答