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

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

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

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

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

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

Возможное решение в этом связанном вопросе: stackoverflow.com/a/2421476/5114784

György Kőszeg 25.10.2018 08:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
413
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Class Method - allows you to invoke the method without requiring a class instances. However these methods still allow overriding in derived class (thus in some way still carrying some class information).

Вы уверены?

Тем не менее, самое близкое, что у нас есть, - это класс со статическим методом.

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

but I would like to be able to mark the base method as virtual and override it in derived class

Извините, ничего не поделаешь. В C# нет возможности сделать это.

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

Спасибо за быстрый ответ. Я относительно уверен, если только мои глаза не обманывают меня. Тест: у меня есть метод экземпляра в базовом классе. Этот метод экземпляра вызывает метод класса (не отмеченный как статический) в базовом классе. Пошаговое выполнение в режиме отладки показывает, что вызывается метод класса производного класса. Именно то, что я хочу, хотя никогда не ожидал, что это произойдет. И да, снова буду проходить через .net docs.

Danie van Eeden 25.10.2018 08:49

Я думаю, что вам, возможно, придется быть немного строже с ключевыми словами здесь. Метод экземпляра - это методы, требующие создания объекта его класса перед его вызовом. Статические методы - это методы в C#, которые можно вызывать без создания объекта класса.

TheGeneral 25.10.2018 08:52

Привет еще раз спасибо. Да, я согласен со значением ключевых слов. Однако я думаю, что понял причину такого поведения. Сначала я вызываю метод экземпляра (экземпляр объекта), затем метод экземпляра вызывает метод класса. Поскольку я не указываю имя класса как часть вызова (просто вызываю имя функции), метод класса теперь ведет себя как метод экземпляра. Отлично .. просто никогда не знал, что это так. ** должен был опубликовать код, упростило бы это. извинения)

Danie van Eeden 25.10.2018 09:00

@TheGeneral в Delphi методы class все еще имеют параметр Self, но он указывает на тип класса вместо указателя на объект. И да, методы class могут быть virtual и отменены. С другой стороны, методы static не имеют параметра Self, поэтому они не могут быть virtual.

Remy Lebeau 25.10.2018 09:50

@Danie: нет, он по-прежнему ведет себя как метод класса, даже если вы вызываете его из экземпляра. В методе экземпляра класса вам просто не нужно уточнять его именем класса, это подразумевается.

Rudy Velthuis 25.10.2018 11:47

@TheGeneral: в Delphi даже конструкторы может быть виртуальным. Это то, что вы увидите только в языках, производных от Object Pascal. Виртуальность конструктора полезна, если вы вызываете его из метакласса. Метакласс содержит тип класса, и вызов виртуального конструктора означает, что вы вызываете конструктор фактического класса, содержащегося в метаклассе. В C# это может быть только смоделированный с использованием GetType () и отражения, AFAIK.

Rudy Velthuis 25.10.2018 11:53

@RudyVelthu, да, раньше я использовал delphi 5 и 6, но я изо всех сил пытаюсь запомнить все эти детали

TheGeneral 25.10.2018 12:09

@ Руди Велтуис: да, в этом есть смысл. Подразумеваемый квалификатор для вызова метода класса - это имя текущего экземпляра. Поведение функции не меняется.

Danie van Eeden 25.10.2018 13:44

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

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

Спасибо за быстрый ответ. Да, я думаю, это было бы хорошим решением для C#. Передача информации о типе. Было просто интересно, поддерживается ли это неявно.

Danie van Eeden 25.10.2018 08:51

Я так не думаю - в Delphi нет эквивалента C# "class of". Вы можете использовать обобщенные шаблоны с ограничением типа "where", но обобщенные шаблоны оцениваются во время компиляции, они не являются динамическими.

Dmitry Streblechenko 25.10.2018 15:53

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

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

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

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

Rudy Velthuis 25.10.2018 11:59

Не забывайте, что главный архитектор C# Андерс Хейлсберг был также главным архитектором Delphi во времена Borland.

Rudy Velthuis 25.10.2018 12:01

Другие вопросы по теме