如何覆盖整数,字符串等基本类型?

时间:2010-11-12 21:47:31

标签: vb.net types override

我正在为大型应用程序扩展vb.net中的一些基本数据类型。这包括integerstringshort等。目前,我的新数据类型对象的名称类似于MYInteger和MYString。由于这些是我用于我的应用程序的唯一类型,并且它们大多与默认类型兼容,有没有办法可以覆盖默认类型,所以当你Dim iThing as Integer实际上使用我的轻微定制时整数类型?

3 个答案:

答案 0 :(得分:8)

没有。如果可以,那么想象一下会造成的混乱。在这种情况下有两种可能性:

  1. 在同一进程中运行的所有代码都将使用这些类型,甚至是不期望它的代码。坏。

  2. Integer的概念与CLR的Integer概念不同,突然两个相同类型的对象不同。坏。

  3. 可以向密封类型添加扩展方法。类似的东西:

    Module MyExtensions
        <Extension()>
        Public Function Extended(i as Integer) As Integer
            return i + 4
        End Function
    End Module
    
    4.Extended() ' evaluates to 8
    

答案 1 :(得分:2)

我不知道它是否适用于你的情况,但有时人们想要制作相当于“专门”标量/原始类型的东西。

例如,请参阅this codeplex project中定义的某些类型。一些类型包括Latitude,Longitude,Angle等。这些类型中的每一个实际上都是一个带有单个数据成员的结构,通常是double,float或int / long,如下所示:

public struct Latitude : IFormattable, IComparable<Latitude>, IEquatable<Latitude>
{
  private readonly double _DecimalDegrees;

  //Some constants

  //Some constructors

  //Some static fields like...
  public static readonly Latitude Equator = new Latitude(0.0);
  public static readonly Latitude TropicOfCapricorn = new Latitude(-23.5);
  public static readonly Latitude TropicOfCander = new Latitude(23.5);

  //Some operators
  public static Latitude operator +(Latitude left, Latitude right)
  {
    return new Latitude(left.DecimalDegrees + right.DecimalDegrees);
  }

  public static Latitude operator +(Latitude left, double right)
  {
    return new Latitude(left.DecimalDegrees + right);
  }
}

从技术上讲,这些类型只是类或结构(主要是链接项目的结构),但它们用于表示通常(通常是?,几乎总是??)简单标量值的值。如果你有一个具有Angle属性的对象,那么大多数人可能只是将它变为double。

public MyObject
{
  public double AngleInDegrees { set; get; }
}

将值赋给AngleInDegree时,MyObject可能需要进行一些处理:

public double AngleInDegrees
{
  get
  {
    return _AngleInDegrees;
  }
  set
  {
    if (value < 0 || value > 360)
    {
      _AngleInDegrees = NormalizeAngle(value);
    }
    else
    {
      _AngleInDegrees = value;
    }
  }
}

如果您在许多对象上有AngleInDegrees属性,该怎么办?如果您的类消耗了应用程序中其他组件产生的角度,该怎么办?谁应该进行验证?能够指望始终使用“好”角度是很有用的吗?

通过具有AngleInDegrees类型,可以将所有验证和特殊“角度”操作放入类型中。也可以强烈键入要使用AngleInDegree的所有位置。

正如我所说,我不知道这是否是你想要达到的目标。当我第一次看到我链接的项目(也就是看起来它们实际上是继承原始数据类型以制作更具限制性的原始类型)时,我刚刚读到你的问题时发生了我的想法。 )。

答案 2 :(得分:1)

我不确定你是否真的想这样做。这将使将来更难维护。为什么不使用MyInteger等。如果要导入外部源代码,只需执行查找和替换。