Есть ли путь к классу для 'удаления' методов, которые он наследовал?
Например, если я не хочу, чтобы мой класс имел a ToString()
метод я могу сделать что-то так, чтобы это больше не было доступно?
Нет - это нарушит Принцип замещения Лискова. Вы всегда должны иметь возможность использовать экземпляр подтипа так, как если бы он был экземпляром супертипа.
Не забывайте, что вызывающая сторона может знать о вашем типе только "как" о базовом типе или интерфейсе. Рассмотрим этот код:
object foo = new TypeWithToStringRemoved();
foo.ToString();
Это должно было бы компилироваться, не так ли? А что, по вашему мнению, произойдет во время выполнения?
Теперь о ToString
, GetHashCode
, Equals
и GetType
- нет способа избежать их наличия в первую очередь, но обычно, если есть методы, которые вы хотите "удалить" из базового типа, это означает, что вы не должны наследоваться от него в первую очередь. Лично я считаю, что роль наследования несколько преувеличена в объектно-ориентированном программировании: там, где оно полезно, оно действительно полезно, но в целом я предпочитаю композицию, а не наследование, и интерфейсы как форму абстракции, а не базовые классы.
Вы можете создать исключение NotSupportedException , пометить его как Obsolete и использовать EditorBrowsable :
[EditorBrowsable( EditorBrowsableState.Never )]
[Obsolete( "...", false )]
void YourMethod()
{
throw new NotSupportedException( "..." );
}
РЕДАКТИРОВАТЬ:
Как указали другие: я описываю способ «отключить» методы, но вы должны тщательно подумать, где вы хотите это использовать. Особенно бросание исключений может быть очень опасной вещью.
Короткий ответ: НЕТ, так как все классы наследуют от объекта, а объект имеет этот метод.
Как указывали другие, вы не можете "удалить" метод, но если вы чувствуете, что он каким-то образом вас обидел, вы можете скрыть it в производном классе.
Из документации Microsoft (устарело):
class Base
{
public static void F() {}
}
class Derived: Base
{
new private static void F() {} // Hides Base.F in Derived only
}
class MoreDerived: Derived
{
static void G() { F(); } // Invokes Base.F
}