Я провел поиск, но не могу найти точного соответствия по этому вопросу. Если я пропустил, пожалуйста, перенаправьте меня.
В Delphi / Object Pascal у вас есть две концепции:
* Вы можете поправить меня по вышеизложенному.
Вопрос: Что эквивалентно методу класса Delphi (не статическому) в C#? Я хотел бы иметь возможность объявить метод, который я могу вызывать, не имея экземпляра класса - но. Я хотел бы иметь возможность пометить базовый метод как виртуальный и переопределить его в производных классах.
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.
Я думаю, что вам, возможно, придется быть немного строже с ключевыми словами здесь. Метод экземпляра - это методы, требующие создания объекта его класса перед его вызовом. Статические методы - это методы в C#, которые можно вызывать без создания объекта класса.
Привет еще раз спасибо. Да, я согласен со значением ключевых слов. Однако я думаю, что понял причину такого поведения. Сначала я вызываю метод экземпляра (экземпляр объекта), затем метод экземпляра вызывает метод класса. Поскольку я не указываю имя класса как часть вызова (просто вызываю имя функции), метод класса теперь ведет себя как метод экземпляра. Отлично .. просто никогда не знал, что это так. ** должен был опубликовать код, упростило бы это. извинения)
@TheGeneral в Delphi методы class
все еще имеют параметр Self
, но он указывает на тип класса вместо указателя на объект. И да, методы class
могут быть virtual
и отменены. С другой стороны, методы static
не имеют параметра Self
, поэтому они не могут быть virtual
.
@Danie: нет, он по-прежнему ведет себя как метод класса, даже если вы вызываете его из экземпляра. В методе экземпляра класса вам просто не нужно уточнять его именем класса, это подразумевается.
@TheGeneral: в Delphi даже конструкторы может быть виртуальным. Это то, что вы увидите только в языках, производных от Object Pascal. Виртуальность конструктора полезна, если вы вызываете его из метакласса. Метакласс содержит тип класса, и вызов виртуального конструктора означает, что вы вызываете конструктор фактического класса, содержащегося в метаклассе. В C# это может быть только смоделированный с использованием GetType () и отражения, AFAIK.
@RudyVelthu, да, раньше я использовал delphi 5 и 6, но я изо всех сил пытаюсь запомнить все эти детали
@ Руди Велтуис: да, в этом есть смысл. Подразумеваемый квалификатор для вызова метода класса - это имя текущего экземпляра. Поведение функции не меняется.
В C# этого сделать нельзя - считается, что статические методы всегда вызываются для определенного типа, и никогда не бывает экземпляра. Это неверно, поскольку вы можете передать информацию о типе производного класса функции, которая принимает базовый тип класса ...
Если функция не должна делать ничего необычного (например, она просто возвращает статическое значение), вы можете обойтись без использования атрибута класса вместо виртуального статического метода.
Спасибо за быстрый ответ. Да, я думаю, это было бы хорошим решением для C#. Передача информации о типе. Было просто интересно, поддерживается ли это неявно.
Я так не думаю - в Delphi нет эквивалента C# "class of". Вы можете использовать обобщенные шаблоны с ограничением типа "where", но обобщенные шаблоны оцениваются во время компиляции, они не являются динамическими.
Delphi и C# имеют некоторое сходство. Оба они не поддерживают множественное наследование.
Переходя к вашим вопросам, для методов, в которых вы собираетесь скрыть реализацию метода базового класса, вы можете использовать ключевое слово new.
Статический код в Delphi работает так же, как C#. Вы не можете переопределить статический метод. Если вы хотите применить то же самое, C# также поставляется со статическим и запечатанным (для класса) ключевым словом.
На самом деле речь идет о методах виртуального класса, которых в C# просто нет. В Delphi есть обычные методы класса, которые также имеют параметр Self / this, но для методов класса Self - это класс, а не экземпляр. Эти методы класса могут быть виртуальными. Но вы также можете пометить их как статические, что тогда будет таким же, как в C#. Скрытие с помощью new
- это то, что Delphi делает с reintroduce
.
Не забывайте, что главный архитектор C# Андерс Хейлсберг был также главным архитектором Delphi во времена Borland.
Возможное решение в этом связанном вопросе: stackoverflow.com/a/2421476/5114784