Из комментариев справочной страницы php date()
:
У вас был «Y» правильный - это полный год, но «M» - это три символа месяца, а «м» - двухзначный месяц. Такая же проблема с «D» вместо «d». «G» - это 1 или 2-значный час, где «H» всегда имеет преимущество 0 при необходимости.
Я предполагаю, что тот, кто сказал вам написать «чистый виртуальный» метод, был программистом на C ++, а не программистом на C # ... но эквивалент является абстрактным методом:
public abstract void TurnRight();
Это заставляет конкретные подклассы для переопределения TurnRight
с реальной реализацией.
У вас тогда нет реализации в классе Airplane_Abstract, но они вынуждают потребители «наследовать» класса для их реализации.
Класс Airplane_Abstract непригоден до тех пор, пока вы не наследуете и не выполняете абстрактные функции.
Чистая виртуальная функция - это терминология C ++, но в C #, если функция, которая реализована в классе Derived, и этот производный класс не является абстрактным классом.
abstract class PureVirtual
{
public abstract void PureVirtualMethod();
}
class Derivered : PureVirtual
{
public override void PureVirtualMethod()
{
Console.WriteLine("I'm pure virtual function");
}
}
«Чистая виртуальная» - это терминология C ++. C # эквивалент - абстрактный метод.
http://en.wikipedia.org/wiki/Virtual_function
«В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых может быть переопределено внутри наследующего класса функцией с той же сигнатурой ».
Google всегда является вашим другом.
Вероятно, они означают, что методы должны быть помечены abstract
.
public abstract void TurnRight();
Затем вам необходимо реализовать их в подклассах, в отличие от пустого виртуального метода, в котором подкласс не будет должны переопределить его.
Или даже вы можете перейти к интерфейсу, считая, что требуется небольшое ограничение:
public interface IControllable
{
void Move(int step);
void Backward(int step);
}
public interface ITurnable
{
void TurnLeft(float angle);
void TurnRight(float angle);
}
public class Airplane : IControllable, ITurnable
{
void Move(int step)
{
// TODO: Implement code here...
}
void Backward(int step)
{
// TODO: Implement code here...
}
void TurnLeft(float angle)
{
// TODO: Implement code here...
}
void TurnRight(float angle)
{
// TODO: Implement code here...
}
}
Однако вам придется реализовать все объявление функции как IControllable
, так и ITurnable
в противном случае произойдет ошибка компилятора. Если вам нужна дополнительная реализация virutal, вам нужно будет пойти abstract class
для виртуального метода с interface
для чистого виртуального метода.
На самом деле существует разница между функцией interface
и abstract
функция interface
объявляет только функцию, вся функция interface
должна быть общедоступной, поэтому нет свойства fancy class, такого как private
или protected
, поэтому она очень быстрая, а функция abstract
- это метод фактического класса без реализация и принудительное выполнение в производном классе, поэтому вы можете поместить private
, protected
и переменные-члены доступа с функциями abstract
, и большую часть времени это медленнее, потому что отношения наследования класса анализируются во время выполнения. (aka vtable)