Nano Hash - криптовалюты, майнинг, программирование

Как перегрузить функцию на основе типа результата?

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

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» отличается от предыдущего объявления

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


  • В принципе, в некоторых ситуациях компилятор может делать то, что вы хотите. Ваш пример строки и целого числа будет тривиальным для обработки. Но эта функция не реализована. 15.09.2011
  • IMO, то, что вы пытаетесь выполнить, не будет полезным, усложнит поддержку вашего кода и кажется противоречащим здравому смыслу. 15.09.2011
  • Связанный вопрос: stackoverflow.com/questions/2124841/ 15.09.2011

Ответы:


1

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

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

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


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

15.09.2011
  • Спасибо за ответ, да, я имею в виду с тем же именем; я ошибся, прежде чем извините. 15.09.2011
  • См. часть под строкой: всегда публикуйте фактический код, скопированный непосредственно из редактора, а не какой-то придуманный код, набранный непосредственно в вашем браузере. 15.09.2011

  • 2

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

    myclass = class
    public
      procedure Funct1(var AResult: String); overload;
      procedure Funct1(var AResult: Integer); overload;
    end;
    
    15.09.2011

    3

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

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

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

    var
      v: Variant;
      mc: myclass;
    begin
      v := mc.Funct1;
    end;
    
    15.09.2011
  • +1 За пример, почему перегрузка не может различать только типы результатов. 15.09.2011
  • компилятор никак не может сказать, почему нет? компилятор может знать, когда вызывается функция, ожидая каждого типа результата. 20.07.2020
  • Не совсем. Рассмотрим это: var a: вариант; а := мой класс.Функция1; 23.07.2020

  • 4

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

    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;
    
    30.05.2018
  • Умно то, что вы делаете, однако обманывать компилятор никогда не было мудрым решением. 31.03.2019
  • Спасибо, я думаю ... А что касается проблемы с обманом компилятора, то это на самом деле исходит из самого вопроса! потому что то, что мы пытаемся сделать с самого начала, - это перегрузить функцию на основе типа результата, а это означает обмануть компилятор, так что вот как вы можете понять вопрос, как я могу обмануть компилятор, чтобы перегрузить функцию на основе результата тип?, что я хочу сказать, так это то, что этот вопрос заслуживает этого ответа, в противном случае я просто использовал шаблон стратегии из шаблонов поведенческого проектирования ... и он используется почти везде, включая VCL 02.04.2019
  • Сначала я подумал, что это хороший хак. но vValue:= yourobject.Funct1() не будет компилироваться в Delphi 5. с ошибкой: Ambiguous overloaded call to 'Funct1'. Возможно, это компилируется в более новых версиях. Я не могу подтвердить прямо сейчас. 11.06.2019
  • @kobik Я подтверждаю, что это работает в Delphi 7 и более поздних версиях. 24.09.2019

  • 5

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

    TmyClass = class (TObject)
    public
      function AsString : string;
      function AsInteger : Integer;
    end;
    
    15.09.2011
  • Это зависит от результата, являющегося различным представлением одного и того же значения. 15.09.2011
  • Верно, но первоначальный вопрос касался их перегрузки, что, на мой взгляд, означало бы, что все они связаны (поскольку у них нет параметров, их результаты должны быть связаны). В любом случае, называйте функции в соответствии со значением их результата, и все в порядке. 15.09.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..