1

我有一个关于命名具有相似功能的多个类的问题。我正在开发一个科学 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>称为 a 的类型MzRange,它共享所有相同的结构和功能,MassRange但我想在 API 中保持独立。它们的行为完全相同并存储相同类型的数据,但就科学而言,它们是不同且截然不同的。

因此,我考虑将MassRange类重命名为更通用的名称,DoubleRange然后将两者兼有MassRange : DoubleRangeMzRange : DoubleRange设计如下:

public MzRange : DoubleRange, IRange<double> {}

public MassRange : DoubleRange, IRange<double> {}

但我并不在乎这个名字DoubleRange,也不想通过我的 API 公开它。公开具有相同功能的两种不同类型是否合适?我应该想出一个更好的名字DoubleRange并放弃MzRangeandMassRange吗?我可以制作DoubleRange内部或其他东西,以便它不会通过 API 公开但仍然可以使用吗?

这似乎是扩展属性的情况,但我知道它们目前不存在。

4

3 回答 3

1

There doesn't seem to be any reason you can't accomplish this with standard 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;
}

And then you can call it from any implementation of IRange:

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

I know it may not have the syntactic appeal of extension properties, but it's a clean solution that gets around having to create that DoubleRange class.

于 2014-03-25T17:19:41.153 回答
0

这是绝对合适的。除了逻辑上的区别之外,它还使您有可能在将来独立地发展这两个类。

即使大象和鸟类都是动物(都继承自动物)并且都具有相同的属性集(它们不添加或覆盖成员),您可能希望Fly将来为鸟类添加一个方法。我假设现实世界中不存在名为Dumbo的大象 :-)

于 2014-03-25T17:21:13.563 回答
0

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

除非您知道这一点MassRange并且MzRange在将来的某个时候会有所区别,否则为 / 提供更好的名称DoubleRange并放弃MassRange/MzRange是要走的路。即便如此,任何共享功能都需要放在父类型中。

你总是可以提供一些语法糖来帮助用户。例如,您可以创建名为MassRangeand的“哑”类MzRange,它只是扩展DoubleRange. 我会保留原始的、命名良好的类,以鼓励用户使用它,但如果你真的想隐藏它,只需使用protected访问器而不是public.

于 2014-03-25T18:17:36.447 回答