具有不同名称的多个相同类是否合适?

时间:2014-03-25 17:11:35

标签: c# inheritance nomenclature

我有一个关于命名具有相似功能的多个类的问题。我正在研究一个科学API,并有以下类/接口:

public interface IRange<T>{
    T Minimum {get;}
    T Maximum {get;}
    // A few other methods that aren't important
}

public class Range<T> : IRange<T> where T: IComparable<T> {
    public T Minimum {get; protected set;}
    public T Maximum {get; protected set;}

    public Range(T minimum, T maximum) {
        Minimum = minimum;
        Maximum = maximum;
    }
}

对于我的API,我使用double范围很多(即Range<double>),因此我创建了另一个名为MassRange的类。这个类还有一些新的构造函数和属性如下所示:

public class MassRange : Range<double>, IRange<double> {
    public double Width { get { return Maximum - Minimum;} }
    public double Mean { get { return (Maximum + Minimum) / 2.0;} }

    public MassRange(double mean, MassTolerance width) {
        Minimum = mean - width.Value;  // pseudo-code
        Maximum = mean + width.Value;
    }
}

从概念上讲,我还有另一种Range<double>称为MzRange,它与MassRange共享所有相同的结构和功能,但我想在API中保持独立。它们的行为完全相同并存储相同类型的数据,但就科学而言,它们是不同的和不同的。

所以我考虑将MassRange类重命名为DoubleRange更通用的名称,然后将MassRange : DoubleRangeMzRange : DoubleRange设计为如此:

public MzRange : DoubleRange, IRange<double> {}

public MassRange : DoubleRange, IRange<double> {}

但我并不真正关心名称DoubleRange,而是希望不通过我的API公开宣传它。是否暴露两种不同类型的相同功能甚至是合适的?我应该为DoubleRange提出更好的名称并放弃MzRangeMassRange吗?我可以将DoubleRange内部或某些东西设置为不通过API公开但仍然可以使用吗?

这似乎是Extension Properties的情况,但我知道它们目前还不存在。

3 个答案:

答案 0 :(得分:1)

似乎没有任何理由您无法使用标准extension methods完成此操作:

public static double GetWidth(this IRange<double> range) {
    return range.Maximum - range.Minimum;
}

public static double GetMean(this IRange<double> range) {
    return (range.Maximum + range.Minimum) / 2.0;
}

然后你可以从IRange的任何实现中调用它:

var massRange = ...
var mean = massRange.GetMean();

我知道它可能没有扩展属性的语法上的吸引力,但它是一个干净的解决方案,可以创建DoubleRange类。

答案 1 :(得分:0)

这绝对合适。除了逻辑上的区别,它还为您提供了将来可以相互独立地发展这两个类的可能性。

即使大象和鸟类是动物(均来自动物)并且两者都具有相同的属性集(它们不添加或覆盖成员),您可能希望向鸟类添加Fly方法未来。 我认为在真实场景中不存在名为Dumbo的大象: - )

答案 2 :(得分:0)

具有完全相同功能的两种类型是不合适的,因为对一种类型所做的任何更改都需要对另一种类型进行。

除非您知道MassRangeMzRange将在未来的某个时刻进行区分,为DoubleRange提供更好的名称并放弃{{1 } / MassRange是要走的路。即便如此,任何共享功能都需要放在父类型中。

您始终可以提供一些syntactic sugar来帮助用户。例如,你可以创建&#34; dumb&#34;名为MzRangeMassRange的类,只是扩展MzRange。我保留原来的,名字很好的课程,以鼓励用户使用它,但如果你真的想隐藏它,只需使用DoubleRange访问者而不是protected