Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Вы можете выбросить NotSupportedException, пометить его как Obsolete и используйте EditorBrowsable:

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

EDIT:
Как указывали другие: я описываю способ "отключить" методы, но вы должны тщательно обдумать, где вы хотите это использовать. Особенно бросающие исключения могут быть очень опасной вещью.

Ответ 3

Как указывали другие, вы не можете "удалить" метод, но если вы чувствуете, что это вас обидело, вы можете скрыть его (в вашем классе).

Из документации:

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
}

Ответ 4

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