Есть ли путь к классу для 'удаления' методов, которые он наследовал?

Есть ли путь к классу для 'удаления' методов, которые он наследовал?

Например, если я не хочу, чтобы мой класс имел a ToString() метод я могу сделать что-то так, чтобы это больше не было доступно?

26
задан BartoszKP 15 March 2016 в 16:23
поделиться

4 ответа

Нет - это нарушит Принцип замещения Лискова. Вы всегда должны иметь возможность использовать экземпляр подтипа так, как если бы он был экземпляром супертипа.

Не забывайте, что вызывающая сторона может знать о вашем типе только "как" о базовом типе или интерфейсе. Рассмотрим этот код:

object foo = new TypeWithToStringRemoved();
foo.ToString();

Это должно было бы компилироваться, не так ли? А что, по вашему мнению, произойдет во время выполнения?

Теперь о ToString, GetHashCode, Equals и GetType - нет способа избежать их наличия в первую очередь, но обычно, если есть методы, которые вы хотите "удалить" из базового типа, это означает, что вы не должны наследоваться от него в первую очередь. Лично я считаю, что роль наследования несколько преувеличена в объектно-ориентированном программировании: там, где оно полезно, оно действительно полезно, но в целом я предпочитаю композицию, а не наследование, и интерфейсы как форму абстракции, а не базовые классы.

33
ответ дан 28 November 2019 в 06:48
поделиться

Вы можете создать исключение NotSupportedException , пометить его как Obsolete и использовать EditorBrowsable :

[EditorBrowsable( EditorBrowsableState.Never )]
[Obsolete( "...", false )]
void YourMethod()
{
    throw new NotSupportedException( "..." );
}

РЕДАКТИРОВАТЬ:
Как указали другие: я описываю способ «отключить» методы, но вы должны тщательно подумать, где вы хотите это использовать. Особенно бросание исключений может быть очень опасной вещью.

18
ответ дан 28 November 2019 в 06:48
поделиться

Короткий ответ: НЕТ, так как все классы наследуют от объекта, а объект имеет этот метод.

1
ответ дан 28 November 2019 в 06:48
поделиться

Как указывали другие, вы не можете "удалить" метод, но если вы чувствуете, что он каким-то образом вас обидел, вы можете скрыть 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
}
6
ответ дан 28 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: