С# закрыто против Java final
Кто-нибудь, пожалуйста, скажет мне, что причина, по которой следующее использование sealed
не компилируется? Если я заменил sealed
на final
и скомпилировал его как Java, он будет работать.
private sealed int compInt = 100;
public bool check(int someInt)
{
if (someInt > compInt)
{
return true;
}
return false;
}
Ответы
Ответ 1
Это потому, что final
в Java означает множество разных вещей в зависимости от того, где вы его используете, тогда как sealed
в С# применяется только к классам и потенциально виртуальным членам (методы, свойства, события).
В Java final
можно применить к:
- классы, что означает, что класс не может быть унаследован. Это эквивалентно С#
sealed
.
- методы, что означает, что метод не может быть переопределен в производном классе. Это значение по умолчанию в С#, если вы не объявите метод как
virtual
и в производном классе это может быть предотвращено для последующих производных классов с sealed
снова.
- поля и переменные, что означает, что их можно инициализировать только один раз. Для полей эквивалент в С# равен
readonly
.
Ответ 2
Sealed
в C#
может применяться только к ссылочным типам и влияет на дерево наследования.
На практике тип, обозначенный как Sealed
, является последним "листом" в дереве наследования, или, короче говоря, вы не можете получить тип, объявленный как a Sealed
.
public sealed class Child : Base
{
}
public class AnotherAgain : Child //THIS IS NOT ALLOWED
{
}
Он не может быть применен к членам.
Ответ 3
Ответ Тиграна не ошибается, в то время как Джои немного неверен.
Во-первых, вы можете посмотреть на эту страницу: Что эквивалентно окончанию Java в С#?.
Ключевое слово sealed
может применяться к class
, instance method
и property
, но не к переменным или интерфейсным методам. Классы с sealed
не могут быть унаследованы. Когда метод sealed
put, он должен быть override
в компании. Каждый struct
равен sealed
, поэтому struct
нельзя унаследовать. Проверьте это изображение: ![sealed usage]()