Поддерживает ли Delphi Generics нижний / верхний границы типа? - PullRequest
0 голосов
/ 24 сентября 2018

Поддерживает ли Delphi нижние / верхние границы типа для своих родовых элементов, например, таких как Scala?

Я ничего не нашел в документах Embarcadero:

Кроме того, имеется неявный намек на границы типов в " Ограничения в обобщенных типах ":

Элементы ограничения включают в себя:

  • Ноль, один или несколько типов интерфейса
  • Ноль или один тип класса
  • Зарезервированное слово "конструктор", "класс" или "запись"

Вы можете указать как «конструктор», так и «класс» для ограничения.Однако «запись» не может сочетаться с другими зарезервированными словами.Несколько ограничений действуют как аддитивное объединение (логика «И»).

Пример:

Давайте рассмотрим поведение в следующем коде Scala, который демонстрируетиспользование ограничения типа верхней границы.Я нашел этот пример в сети :

class Animal
class Dog extends Animal
class Puppy extends Dog

class AnimalCarer{
  def display [T <: Dog](t: T){ // Upper bound to 'Dog'
    println(t)
  }
}

object ScalaUpperBoundsTest {
  def main(args: Array[String]) {

    val animal = new Animal
    val dog = new Dog
    val puppy = new Puppy

    val animalCarer = new AnimalCarer

    //animalCarer.display(animal) // would cause a compilation error, because the highest possible type is 'Dog'.

    animalCarer.display(dog) // ok
    animalCarer.display(puppy) // ok
  }
}

Есть ли способ добиться такого поведения в Delphi?

1 Ответ

0 голосов
/ 24 сентября 2018

В Delphi этот пример будет выглядеть следующим образом (лишенный значения нерелевантный код):

type
  TAnimal = class(TObject);

  TDog = class(TAnimal);

  TPuppy = class(TDog);

  TAnimalCarer = class
    procedure Display<T: TDog>(dog: T);
  end;

var
  animal: TAnimal;
  dog: TDog;
  puppy: TPuppy;
  animalCarer: TAnimalCarer;
begin
//  animalCarer.Display(animal); // [dcc32 Error] E2010 Incompatible types: 'T' and 'TAnimal'
  animalCarer.Display(dog);
  animalCarer.Display(puppy);
end.

Невозможно указать нижнюю границу, как показано в статье, на которую вы ссылаетесь, потому что Delphi не поддерживает это.Он также не поддерживает дисперсию типов.

Редактировать: FWIW, в этом случае метод Display даже не должен быть универсальным, а параметр dog может просто иметь тип TDog, поскольку вы можете передать любой подтип.Из-за ограниченных возможностей обобщений в Delphi метод Display не выиграет от того, что он является обобщенным.

...