(1) Статические методы нельзя переопределить, однако они могут быть скрыты с использованием ключевого слова «новое». В основном методы переопределения означают, что вы ссылаетесь на базовый тип и хотите вызвать производный метод. Поскольку static являются частью типа и не подпадают под запросы vtable, что не имеет смысла.
Э.Г. статика не может сделать:
public class Foo {
public virtual void Bar() { ... }
}
public class Bar : Foo {
public override void Bar() { ... }
}
// use:
Foo foo = new Bar(); // make an instance
foo.Bar(); // calls Bar::Bar
Поскольку статика не работают в случаях, вы всегда указывать foo.bar или Bar.Bar явно. Поэтому переопределение здесь не имеет смысла (попробуйте выразить его в коде ...).
(2) Существуют разные способы использования статических методов. Например, он используется в шаблоне Singleton для получения одного экземпляра типа. Другим примером является «static void Main», который является основной точкой доступа в вашей программе.
В основном вы используете их, когда вы не хотите или не можете создать экземпляр объекта перед его использованием. Например, когда статический метод создает объект.
[обновление]
Простой пример скрытие:
public class StaticTest
{
public static void Foo() { Console.WriteLine("Foo 1"); }
public static void Bar() { Console.WriteLine("Bar 1"); }
}
public class StaticTest2 : StaticTest
{
public new static void Foo() { Console.WriteLine("Foo 2"); }
public static void Some() { Foo(); Bar(); } // Will print Foo 2, Bar 1
}
public class TestStatic
{
static void Main(string[] args)
{
StaticTest2.Foo();
StaticTest2.Some();
StaticTest.Foo();
Console.ReadLine();
}
}
Обратите внимание, что если вы сделаете классы static
, вы не можете сделать это. Статические классы должны быть получены от object
.
Основное отличие между этим и наследованием заключается в том, что компилятор может определить во время компиляции, какой метод вызывать при использовании static. Если у вас есть экземпляры объектов, вам нужно сделать это во время выполнения (который называется поиском vtable).
Нет, они не могут быть переопределены. Они связаны с классом, а не с объектом. –
для реального использования: вы можете вызвать статический метод без экземпляра класса. – Najzero
Спасибо. Я понимаю [что такое статический метод] (http://stackoverflow.com/a/4124118/2061309), лучший пример, данный SLaks. Поэтому для моего вопроса об переопределении статического метода (если bydefault является окончательным, а не сделать его окончательным) - означает ли это, что подкласс этого класса, который содержит статический, может определять статический метод с той же сигнатурой? – aspiring