c#-应该将这种(通用范围类)条件逻辑替换为多态吗?如果是,那为什么呢?
作者:互联网
下面显示的是通用范围类.这样做的目的是保存一个范围,然后在请求时稍后指定(布尔值)是否给定值在范围内.
我已阅读多个帖子,问题,博客等,内容为“ Replace Conditional with Polymorphism”
我的问题是,真的值得将代码分成多个类,其中每个类从字面上看都是一行代码.希望下面的代码能显示我的意思.
该类还依赖于另外两个类,这里没有显示,但是如果有人需要它,我可以在以后包括它.
namespace Common.Utilities
{
public class GenericRange<T>
where T : struct, IComparable<T>
{
#region Properties
public T Min { get; private set; }
public T Max { get; private set; }
public GenericRangeType RangeType { get; private set; }
#endregion
#region Constructors
public GenericRange(T min, T max, GenericRangeType rangeType = GenericRangeType.Inclusive)
{
// Check Parameters
Min = min;
Max = max;
RangeType = rangeType;
}
#endregion
#region Methods
#region Private
private bool IsInclusive(T value)
{
return value.IsGreaterThanOrEqualTo(Min) && value.IsLessThanOrEqualTo(Max);
}
private bool IsInclusiveMin(T value)
{
return value.IsGreaterThanOrEqualTo(Min) && value.IsLessThan(Max);
}
private bool IsInclusiveMax(T value)
{
return value.IsGreaterThan(Min) && value.IsLessThanOrEqualTo(Max);
}
private bool IsExclusive(T value)
{
return value.IsGreaterThan(Min) && value.IsLessThan(Max);
}
#endregion
#region Public
public bool Contains(T value)
{
switch (RangeType)
{
case GenericRangeType.Inclusive: return IsInclusive(value);
case GenericRangeType.InclusiveMin: return IsInclusiveMin(value);
case GenericRangeType.InclusiveMax: return IsInclusiveMax(value);
case GenericRangeType.Exclusive: return IsExclusive(value);
default: throw new NotImplementedException();
}
}
public override string ToString()
{
return String.Format("Min: {0}, Max: {1}, Type: {2}", Min, Max, RangeType);
}
#endregion
#endregion
}
}
唯一的Public方法是:Contain和ToString.
如果我通过多态性正确理解了它,那么应该为每种比较类型创建一个单独的具体类,然后将其包含一个虚方法.
我主要要了解的是,好处/优点是什么?
如果这是这个问题的错误发源地,那么对不起.让我知道,我将移动它.
编辑1:
如果有人需要的话,可以完成此操作的附加代码:
public static class ComparableExtensions
{
public static bool IsEqualTo<T>(this T leftHand, T value) where T : IComparable<T>
{
return leftHand.CompareTo(value) == 0;
}
public static bool IsGreaterThan<T>(this T leftHand, T value) where T : IComparable<T>
{
return leftHand.CompareTo(value) > 0;
}
public static bool IsGreaterThanOrEqualTo<T>(this T leftHand, T value) where T : IComparable<T>
{
return leftHand.CompareTo(value) >= 0;
}
public static bool IsLessThan<T>(this T leftHand, T value) where T : IComparable<T>
{
return leftHand.CompareTo(value) < 0;
}
public static bool IsLessThanOrEqualTo<T>(this T leftHand, T value) where T : IComparable<T>
{
return leftHand.CompareTo(value) <= 0;
}
}
public enum GenericRangeType
{
Inclusive,
Exclusive,
InclusiveMin,
InclusiveMax
}
解决方法:
将其分为不同的类可以使您扩展Contains,而无需更改现有代码.在这种情况下,没有什么太大的意义,因为您已经在这里涵盖了包含的所有基础,但是在其他情况下,可扩展性可能非常有用.
标签:oop,if-statement,generics,switch-statement,c 来源: https://codeday.me/bug/20191201/2080531.html