Ошибки PascalABC.NET

Ну так реализуйте, напишите как. Вот на гитхаб это не правильно сразу сувать потому что возможно есть способ написать что то типа:

type
  I1<T>=interface
    function f1: T;
  end;
  I2 = interface
    function f1: object;
  end;
  
  C1<T>=class(I1<T>, I2)
    
    a: T;
  
  public
    function I1.f1: T := a;
    
    function I2.f1: object := a;
  
  end;

begin end.

То есть явно указать функцию какого интерфейса реализовываем. Если бы вы посмотрели на пример внимательно - увидите что я явно реализовал оба интерфейса, но компилироваться это не хочет, потому что Program1.pas(16) : Повторное объявление на строчке реализации второй f1.

1 лайк

Кхм, однако лично для I2.f1 это работает:

    function f1: T := a;
    
    function I2.f1: object := a;

Так даже вся программа откомпилируется, но это не симметрично => уродливо, кроме того - не работает если оба интерфейса - шаблоны. А как для I1.f1 так же сделать?

    function I1.f1: T := a;

Program1.pas(14) : Количество шаблонных параметров типа I1<T> должно равняться 1

    function I1<T>.f1: T := a;

Program1.pas(9) : Класс C1<T> не реализует метод f1:T интерфейса I1<T>

    function I1&<T>.f1: T := a;

Program1.pas(14) : Встречено '&', а ожидалось ';'

1 лайк

вот это баг. все остальное не баги. запостите на гитхаб

Почему все остальные не баги? Можете обосновать?

1 лайк

И правда, интересный вопрос. Ну, #1, допустим не должно работать потому что:

type
  I1<T>=interface end;
  
  C1<T1, T2>=class(I1<T1>, I1<T2>)
  
  end;

begin end.

В таком случае надо явно указать к какому из этих 2 интерфейсов относится функция.

А вот последнее не понятно, @Admin можете дать чёткое определение работе &? Оно только для функций должно работать? У меня вроде получилось недавно запихнуть его перед спецификатором шаблона класса и оно ничего не сделало, это ошибка?

Могу. Он позволяет сказать внутри выражения, что это точно не операция <

Вот как… Тогда в варианте #3 оно, конечно, бесполезно, но и причин запрещать ведь нет?

Знать бы еще, что такое #3

1 лайк

@Admin, почему при таком коде:

type
  TBase = abstract class
  public
    procedure Print() := Write(ToString());
    procedure Println() := Writeln(ToString());
  end;
  
  TDerived = class(TBase)
  public 
    Value: integer;
    
    function ToString(): string; override := $'TDerived: Value = {Value}';
  end;

begin
  var A := new TDerived();
  A.Value := 1;
  A.Println();
end.

Выводится:

TDerived: Value = 1

Но если заменю на:

function ToString() := $'TDerived: Value = {Value}';

, то вывод:

Program2.TDerived

Почему так происходит?

Также второй вопрос:

type
  TMy<T> = class(System.ICloneable)
  public
    Value: T;
    
    constructor(value_: T);
    begin
      Value := value_;
    end;
    
    function Clone(): object := new TMy<T>(Value);
    function CloneAs() := TMy<T>(Clone());
  end;

begin
end.

Почему:

Program3.pas(12) : Ожидалась переменная

? На C# подобный код работает…

Используйте Clone() as TMy

Преобразование типов у нас имеет ограничение - тип должен быть простым именем

1 лайк

Прошу все ограничения написать в справке по PascalABC.Net, чтобы не было вопросов.

А там всё написано. Вы просто невнимательно читаете или неверно трактуете.

Потому что в C языках override ставить необязательно, его используют чтоб компилятор подсказывал, вдруг чего не так. А в паскале если вы его не поставили - значит эта функция не является частью цепочки.

1 лайк

Могли ли бы указать раздел справки в котором сказано про данное ограничение приведения типов?

Спасибо за ответ, теперь понятно.

Справку вообще надо сильно чинить, доделывать и переделывать. По мелочи чинить просто бесполезно.

2 лайка

Операция явного приведения типов Операция явного приведения типов имеет вид

ИмяТипа(выражение)

type t1<T> = class end;

procedure p1<T>(self:t1<T>;a:T); extensionmethod := exit;

begin
  var a := new t1<byte>;
  a.p1(5);//Generic-функция p1 не может быть вызвана с данным набором фактических параметров
end.

Но ведь 5 можно неявно преобразовать к byte, и если написать p1&<byte> - его таки преобразовывает. Это ошибка?

1 лайк