Скрыть виртуальную функцию в унаследованном классе - PullRequest
3 голосов
/ 19 марта 2011

У меня есть класс, который наследуется от LinkButton, и я хочу скрыть OnClinentClick от моего класса.

Что-то вроде этого:

public class MyClass : LinkButton
{
    // some Code
}

И где-то в коде:

MyClass myclass = new MyClass();
MyClass.OnClinentClick = "";//this line must not be accessable

Ответы [ 4 ]

6 голосов
/ 19 марта 2011

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

Вы можете использовать оператор new, однако я бы не советовал.Лично я бы подумал о своем дизайне и / или использовал бы NotSupportedException, если другого пути нет.

4 голосов
/ 19 марта 2011

Вы можете использовать EditorBrowsableAttribute, чтобы предотвратить его предложение IntelliSense, но вы не можете полностью избавиться от него.

[EditorBrowsable(EditorBrowsableState.Never)]
public virtual string OnClientClick { get; set; }

C # поддерживает только публичное наследование,Вы не должны наследовать от класса, методы которого не имеют смысла для всех производных классов.Для решения этой проблемы рассмотрим состав вместо наследования.

0 голосов
/ 19 марта 2011

Вы можете переопределить функцию (то есть заменить базовую реализацию своей, если первая является виртуальной), но вы не можете полностью запретить клиентам вызывать функцию базового класса, если скрыть ее с помощью new, поскольку они всегда могут приводиться к базовому классу.

Обновление:
на самом деле вы не можете изменить доступ с открытого на защищенный / закрытый при переопределении, это не скомпилируется (http://ideone.com/Y65Uh).Кроме того, если вы используете new, чтобы скрыть базовую функцию и сделать ее не вызываемой, исходная функция по-прежнему видна (http://ideone.com/xiL2F). Если вы объявите новую функцию общедоступной (что, возможно, не то, что вам нужно),старую функцию все еще можно вызвать, приведя к базовому классу (http://ideone.com/A3Bji).

0 голосов
/ 19 марта 2011

Как насчет придания ему меньшей видимости. Один из protected и internal может быть тем, что вы хотите. Конечно, это не удаляет такого члена из производного класса, а просто удаляет его из открытого интерфейса. Также требуется контроль над базовым классом. Не знаю, является ли LinkButton одним из ваших классов.

Вы также можете скрыть свойство, повторно введя новое с тем же. Но это плохая идея, и приведение к базовому классу позволяет посторонним получить к нему доступ.

И вам следует подумать об использовании отношения has-a вместо is-a. Т.е. не наследуйте от базового класса, если вы не хотите, чтобы все его открытые члены. Это нарушает принципы ООП, такие как то, что должна быть возможность заменить производный класс там, где ожидается базовый класс.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...