C # Эквивалент функции / процедуры «класса» Delphi

2

Я провел некоторые поиски, но, похоже, не могу найти точное соответствие по этому вопросу. Если я пропустил это, пожалуйста, перенаправьте меня.

В Delphi/Object Pascal у вас есть две концепции:

  1. Метод класса - позволяет вам вызывать метод, не требуя экземпляров класса. Однако эти методы все еще допускают переопределение в производном классе (таким образом, в некотором роде по-прежнему сохраняя некоторую информацию о классе).
  2. Статический метод - помечает метод как статический - таким образом, больше не допускается использование виртуальных/переопределенных ключевых слов - нет информации о классе/нет "знаний" о наследовании

* Вы можете исправить меня на выше.

Вопрос: Что является эквивалентом метода класса Delphi (не статического) в С#? Я хотел бы иметь возможность объявить метод, который я могу вызывать, не имея экземпляра класса - но я бы хотел пометить базовый метод как виртуальный и переопределить его в производных классах.

Теги:
class
inheritance
comparison

3 ответа

3
Лучший ответ

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

Уверены ли вы?

Независимо от этого, у нас ближе всего класс со статическим методом.

public class MyLovelyHorse
{
    public static int HowManyLegs()
    {
        return 4;
    }
}

но я хотел бы иметь возможность пометить базовый метод как виртуальный и переопределить его в производном классе

Извините, не могу сделать. В С# нет возможности сделать это.

Это примерно то время, когда вы, вероятно, должны совершить экскурсию по классам и структурам (Руководство по программированию в С#)

  • 0
    Спасибо за быстрый ответ. Я относительно уверен, если только мои глаза не обманывают меня. Тест: у меня есть метод экземпляра в базовом классе. Этот метод экземпляра вызывает метод класса (не помеченный как статический) в базовом классе. Переход в режиме отладки показывает, что вызывается метод класса производного класса. Именно то, что я хочу, никогда не ожидал, что это произойдет, хотя. И да, снова будет гонг через .net docs.
  • 0
    Я думаю, что вам, возможно, нужно быть немного настойчивее с вашими ключевыми словами здесь. Метод экземпляра - это методы, которые требуют, чтобы объект его класса был создан до его вызова. Статические методы - это методы в C #, которые можно вызывать без создания объекта класса.
Показать ещё 6 комментариев
1

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

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

  • 0
    Спасибо за быстрый ответ. Да, это было бы неплохо для C #, я думаю. Передача информации о типе. Было просто интересно, поддерживается ли это неявно.
  • 0
    Я так не думаю - в Delphi нет эквивалента C # класса «класс». Вы можете использовать дженерики с ограничением «где» для типа, но дженерики оцениваются во время компиляции, они не являются динамическими.
0

Delphi и С# имеют некоторые сходства. Они оба не поддерживают множественное наследование.

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

Статика в Delphi работает так же, как С#. Вы не можете переопределить статический метод. Если вы хотите применить то же самое, С# также поставляется со статическим и закрытым (для класса) ключевым словом.

  • 0
    Это действительно о методах виртуальных классов, которых в C # просто нет. В Delphi есть обычные методы класса, которые также имеют параметр Self / this, но для методов класса Self является классом, а не экземпляром. Эти методы класса могут быть виртуальными. Но вы также можете пометить их как статические, что будет таким же, как в C #. Сокрытие с new - это то, что Delphi делает с reintroduce .
  • 0
    Не забывайте, что главный архитектор C #, Андерс Хейлсберг, был также главным архитектором Delphi, в его дни Borland.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню