public static void Main(String[] args) {

  int x = 10;

  Object obj = (Object)x;

  Console.WriteLine(obj);

 }

}

Такой тип функциональности недоступен в Java. Код, представленный ниже не будет компилироваться, так как примитивы не могут преобразовываться в ссылочные типы:

// BoxEx.java

public class BoxEX {

 public static void main(String args[]) {

  int x = 10;

  object obj = (object)x;

  System.out.println(obj);

 }

}

Распаковка является просто преобразованием объектного типа, приводящим значение снова к соответствующему типу значения. Эта функциональность опять же недоступна в Java. Можно изменить предыдущий код для иллюстрации этой концепции. Сразу заметим, что в то время как упаковка является неявным преобразованием типа, распаковка требует явного преобразования типа. Вот новая реализация BoxEx.cs:

// BoxEX.cs

public class OverflowEX {

 public static void Main(String[] args) {

  int x = 10;

  Object, obj = (Object)x;

  Console.WriteLine(obj);

  int у = (int)obj;

  Console.WriteLine(y);

 }

}

Другим эффективным способом C#, предназначенным для преобразования типов, является возможность определить специальные операторы преобразования. Определенные пользователем преобразования выполняются из типа данных в тип, а не из экземпляра в экземпляр, поэтому они должны быть статическими операциями. Можно использовать ключевое слово implicite для объявления определенных пользователем преобразований из одного типа в другой. Предположим, что имеются два класса Man и Car, которые полностью не связаны. Создадим определенное пользователем преобразование, которое переводит один класс в другой. Ниже приведен листинг Man.cs:

public class Man {

 int arms, legs;

 string name;

 public Man(){}

 public int Arms {

  set {

   arms = value;

  }

  get {

   return arms;

  }

 }

 public string Name {

  set {

   name = value;

  }

  get {

   return name;

  }

 }

 public int Legs {

  set {

   legs = value;

  }

  get {

   return legs;

  }

 }

}

Как можно видеть из приведенного примера, класс Man имеет три свойства: можно задать или извлечь Legs, Arms, Name. Ниже представлен листинг класса Car:

public class Car {

 int wheels, doors, headlights;

 public Car(int wheels, int doors, int headlights) {

  this.wheels = wheels;

  this.doors = doors;

  this.headlights = headlights;

 }

}

He существует на самом деле определенных правил о том, что включать в реализацию специального преобразования. Необходимо, однако, сопоставлять как можно больше пар полей данных между двумя операндами. В случае данного примера поле Car.wheel будет сопоставлено с Man.legs, а поле Car.doors с Man.arms. Не существует поля в Car, которое представляет что-нибудь похожее на Man.Name, но это не мешает использовать его. Можно, скажем, сопоставить Car.headlights с длиной строки, которая хранится в Man.name. Любая реализация, которая имеет смысл для программиста, будет приемлема. В этом случае Man.name не сопоставляется с Car.headlights, вместо этого для headlights жестко кодируется 2, когда делается преобразование, и полностью отбрасывается Man.name. Следующий код содержит модификацию класса Car:

public class Car {

 int wheels, doors, headlights;

 public Car(int wheels, int doors, int headlights) {

  this.wheels = wheels;

  this.doors = doors;

  this.headlight = headlights;

 }

 public static implicit operator Car(Man man) {

  return new Car(man.Legs, man.Arms, 2);

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату