Как я могу переопределить основные типы, такие как целое число, строка и т. Д.? - PullRequest
5 голосов
/ 13 ноября 2010

Я расширяю некоторые основные типы данных в vb.net для большого приложения.Это включает в себя integer, string, short и т. Д. В настоящее время мои новые объекты типа данных имеют имена, такие как MYInteger и MYString.Так как это единственные типы, которые я использую для своего приложения, и они в основном совместимы с типами по умолчанию, есть ли способ, которым я могу переопределить значения по умолчанию с моими, чтобы, когда вы Dim iThing as Integer, вы фактически использовали мой слегка настроенный целочисленный тип

Ответы [ 3 ]

8 голосов
/ 13 ноября 2010

Нет. Если бы вы могли, тогда представьте, какой хаос это вызовет. В этом сценарии было бы две возможности:

  1. Весь код, работающий в одном и том же процессе, будет использовать эти типы, даже код, который этого не ожидает. Bad.

  2. Ваша концепция Integer отличается от концепции CLR о Integer, и внезапно два объекта одного типа различаются. Bad.

Вы можете добавить методы расширения для закрытых типов. Что-то вроде:

Module MyExtensions
    <Extension()>
    Public Function Extended(i as Integer) As Integer
        return i + 4
    End Function
End Module

4.Extended() ' evaluates to 8
2 голосов
/ 13 ноября 2010

Я не знаю, применимо ли это в вашем случае, но иногда люди хотят сделать то, что составляет «специализированные» скалярные / примитивные типы.

Например, см. Некоторые типы, определенные в этого проекта кодового комплекса .Некоторые из типов включают в себя Широту, Долготу, Угол и т. Д. Каждый из этих типов на самом деле является структурой с одним элементом данных, обычно с двойным, с плавающей запятой или 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, большинство людей, вероятно, просто сделают его двойным.

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

Когда значение присваивается AngleInDegrees, MyObject может захотеть выполнить некоторую обработку:

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

Что если у вас есть свойство AngleInDegrees для многих объектов?Что если у вас есть класс, который использует углы, создаваемые другими компонентами в вашем приложении?Кто должен сделать проверку?Полезно иметь возможность рассчитывать на постоянную работу с «хорошими» углами?

Имея тип AngleInDegrees, становится возможным помещать все валидационные и специальные операции «Угол» в тип.Кроме того, становится возможным строго указать все места, где вы хотите использовать AngleInDegrees.

Как я уже сказал, я не знаю, пытаетесь ли вы достичь этого или нет.Когда я прочитал ваш вопрос, мне пришло в голову, что у меня возникла такая же мысль, когда я впервые увидел проект, который я связал (т.е. мне казалось, что они фактически подклассируют примитивные типы данных для создания более ограничительных примитивных типов).).

1 голос
/ 13 ноября 2010

Я не уверен, действительно ли ты хочешь это сделать. Это сделает его более трудным для поддержания в будущем. Почему бы просто не использовать MyInteger и т. Д. Если вы импортируете внешний исходный код, просто найдите и замените.

...