Как перегрузить функцию в зависимости от типа результата? - PullRequest
2 голосов
/ 15 сентября 2011

просто вопрос, у меня есть:

myclass = class
public
  function Funct1: String;
  function Funct2: Integer;
end;

Это вызывает у меня ошибку, поэтому я попытался с:

myclass = class
public
  function Funct1: String; overload;
  function Funct2: Integer; overload;
end;

, но та же проблема;Delphi скажи мне, что имеет тот же параметр.Теперь, я спрашиваю, можно сделать в режиме, чтобы иметь больше функций с тем же именем, но с другим выводом, как в примере?Большое спасибо за помощь.

ОБНОВЛЕНИЕ

Извините, я сделал ошибку, не funct1 и funct2, но оба funct1, поэтому:

myclass = class
public
  function Funct1: String; overload;
  function Funct1: Integer; overload;
end;

Делая так, компиляторверните мне эту ошибку:

[Ошибка DCC] Project1.dpr (15): E2252 Метод 'funct1' с идентичными параметрами уже существует [Ошибка DCC] Project1.dpr (22): E2037 Объявление 'funct1' отличаетсяиз предыдущего объявления

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

Ответы [ 5 ]

10 голосов
/ 15 сентября 2011

Вы можете превратить функцию в процедуру, приняв параметр var:

myclass = class
public
  procedure Funct1(var AResult: String); overload;
  procedure Funct1(var AResult: Integer); overload;
end;
10 голосов
/ 15 сентября 2011

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

Во-вторых, это невозможно сделать.Перегруженные функции должны иметь разные параметры.

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

var
  v: Variant;
  mc: myclass;
begin
  v := mc.Funct1;
end;
10 голосов
/ 15 сентября 2011

То, что вы публикуете, не имеет смысла. Первый пример должен компилироваться без проблем, так как функции имеют разные имена , Funct1 и Funct2 .

Проблемы возникают только тогда, когда методы (или функции) имеют одинаковое имя . Тогда, как правило, директива overload будет в порядке, но overload не сможет различить функции только по возвращаемому значению .

Таким образом, предполагая, что имена совпадают, то, что вы хотите, невозможно. Нет никакой возможности перегрузить эти функции, если они не имеют другой сигнатуры параметра. Вы можете просто дать им разные имена , что в любом случае предпочтительнее, поскольку они, очевидно, делают разные вещи.


FWIW, ваш вопрос имеет недостатки из-за того, что вы, очевидно, не опубликовали точный код, с которым у вас действительно возникли проблемы. Пожалуйста, всегда публикуйте точный код, который вызывает ваши проблемы, и, если есть сообщения об ошибках, всегда публикуйте точное сообщение об ошибке (их обычно можно скопировать с помощью обычных нажатий клавиш, например, Ctrl + C, даже в большинстве частей IDE или в диалоги сообщений в Delphi). Если в сообщении об ошибке есть номера строк, укажите это в исходном коде, который вы публикуете, поскольку у нас не всегда такие же номера строк, как у вас.

2 голосов
/ 15 сентября 2011

Как уже было сказано, вы не можете делать это так, как вы хотите.Тем не менее, вы также можете легко реализовать каждую функцию с другим именем, например, «AsInteger» или «AsString».Ваш код будет более понятным, и, как правило, так и делается в VCL.

TmyClass = class (TObject)
public
  function AsString : string;
  function AsInteger : Integer;
end;
1 голос
/ 30 мая 2018

, если вы хотите перегрузить методы с разными типами возвращаемых значений, просто добавьте фиктивный параметр со значением по умолчанию , чтобы разрешить выполнение перегрузки, но не забывайте, что тип параметра должен быть другим, чтобы логика перегрузки работала например:

type    
    myclass = class
    public
      function Funct1(dummy: string = EmptyStr): String; overload;
      function Funct1(dummy: Integer = -1): Integer; overload;
    end;

используйте это так

procedure tester;
var yourobject : myclass;
  iValue: integer;
  sValue: string;
begin
  yourobject:= myclass.create;
  iValue:= yourobject.Funct1(); //this will call the func with integer result
  sValue:= yourobject.Funct1(); //this will call the func with string result
end;

также не забывайте, что в этом случае у вас будут проблемы с вариантами, как в этом примере:

procedure tester;
var yourobject : myclass;
  vValue: variant;
begin
  yourobject:= myclass.create;
  vValue:= yourobject.Funct1(); 
end;

до тех пор, пока не будет реализована функция варианта:

      function Funct1(dummy: Variant = Unassigned): Variant; overload;
...