2009-11-18 2 views
1

У меня есть пользовательский элемент управления. Обычно он наследует класс UserControl. Но таким образом он наследует все общедоступные методы и свойства UserControl. Но я хочу скрыть все это и реализовать свои собственные методы и свойства.C# - Скрытие всех методов класса UserControl из производного кода

Скажите, что у меня есть пользовательский элемент управления под названием CustomControl.

public class CustomControl : UserControl 

Когда я создаю экземпляр CustomControl:

CustomControl cControl = new CustomControl(); 

Когда я типа cControl. IntelliSense предлагает мне все методы и свойства, полученные из UserControl. Но я хочу перечислить только мои, которые реализованы в классе CustomControl.

Спасибо

+1

Я не знаю, даже если кто-то даже потрудился спросить, в чем причина, по которой вы хотите скрыть все методы управления пользователями? –

+0

Как я уже сказал в другом комментарии, я разрабатываю управление плоттером функции. Таким образом, это не имеет ничего общего с% 95 предлагаемых методов и свойств с intellisense, которые унаследованы от UserControl. Мне нужно только несколько методов и свойств, которые я сейчас разрабатываю. – UnforgivenX

ответ

1

Почему бы не использовать композицию и сделать UserControl член пользовательского элемента управления вместо того, чтобы наследовать от него?

+0

Он не получит конструкторскую поддержку из коробки, что является одной из причин. –

+0

Да, хороший момент. По мнению других, было бы неплохо инкапсулировать эти методы в интерфейс и получить доступ к элементу управления через ссылку на интерфейс, чем сам CustomControl. –

+0

Нейл прав, мне нужна дизайнерская поддержка – UnforgivenX

0

Не наследовать UserControl, наследовать Control.

+0

Он теряет дизайнерский графический интерфейс. Я думаю таким образом – UnforgivenX

1

Вы можете скрыть их от IntelliSense, затеняя их в своем классе (обновляя каждый унаследованный метод с помощью ключевого слова new) и применяя к ним EditorBrowsableAttribute. Но методы все равно будут там и будут по-прежнему вызываться. В общем, нет способа запретить клиентам называть унаследованные методы экземплярами вашего класса.

+0

Но класс UserControl имеет так много свойств и методов. Я не могу скрыть их всех с помощью «частного нового». Это обойдется мне в день – UnforgivenX

+0

Извините, это так хорошо, как только можно. Если вы действительно хотите пойти таким путем, вы можете сделать свой класс частичным и автоматически сгенерировать часть с помощью 'new', используя Reflection на' UserControl' и CodeDOM. –

4

Это не так, как наследование работает. Создав подкласс, вы явно заявляете, что хотите, чтобы все методы и свойства базового класса были доступны.

+1

Весь смысл 'UserControl' заключается в предоставлении поддержки дизайнеров, и для этого требуется наследование. –

+0

Точно, как сказал Павел – UnforgivenX

+0

Я согласен с вами, что я говорю, что «я хочу, чтобы все доступные методы и свойства базового класса были доступны».Проблема в том, что иногда вы говорите только об этом, потому что вам не дают альтернативы. –

6

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

public interface ICustomControl { 
    string MyProperty { get; set;} 
} 

public class CustomControl : UserControl, ICustomControl { 
    public string MyProperty { get; set; } 
} 

...

ICustomControl cControl = new CustomControl(); 

Тогда IntelliSense показывает только MyProperty и члены объекта (и методы расширения, если таковые применяются).

EDIT:

protected ICustomControl CustomControl { get; set; } 
    public Form1() 
    { 
     InitializeComponent(); 
     CustomControl = this.customControl1; 
     CustomControl.MyProperty = "Hello World!"; // Access everything through here. 
    } 

Затем вы можете сделать охват CustomControl внутренним или защищенным внутренним, если вы хотите.

+0

Очень хитрый ... –

+0

Внимательный способ. В конце он выполняет работу за счет дополнительного кода и использует «ICustomControl» вместо простого «CustomControl» – UnforgivenX

+0

Я привык к этому, потому что, если вы создаете UserControl ComVisible, но используете AutoDual, тогда вы будете выставлять свойства/методы, которые нельзя экспортировать ... подробнее об этом на http://msdn.microsoft.com/en-us/library/ms182205(VS.80).aspx. Итак, правильный способ (в C# ... У VB есть ярлык, атрибут ComClass, который является другим вариантом), заключается в явном создании интерфейса в качестве примера в ссылке. –

0

Вы можете сделать это посредством агрегации, например.

public CustomControl 
{ 
    private Control control_; 
    public property control {get{ return _control;}} 
    . 
    . 
    . 
    public void FunctionIWantExposed() {} 
} 

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

1

У вас есть несколько вариантов:

  1. Использования EditorBrowsableAttribute скроют свойства от IntelliSense
  2. Использования BrowsableAttribute скроют свойства из сетки свойств
  3. Скрытия самих свойств, используя «частную новый» скроет от всего

Одобрено:

  1. Использование атрибутов будет скрывать свойства в зависимости от реализации «потребителя», но на уровне языка вы ничего не скрываете. Например, вы можете реализовать сетку свойств, которая проверяет EditorBrowsableAttribute, прежде чем показывать свойство. [Я не уверен в реализации Microsoft Windows Forms]
  2. Использование «private new» также предотвратит доступ к свойствам, хотя внутри вашего контроля вы все же можете позвонить base.PropertyName, чтобы получить доступ к исходным.

Я понимаю ваше намерение. Обычно принято ограничивать поведение унаследованных элементов управления, даже если оно «ломает» концепцию наследования.

+0

Но класс UserControl имеет так много свойств и методов. Я не могу скрыть их всех с помощью «private new» – UnforgivenX

+0

@UnforgivenX: К сожалению, невозможно сразу скрыть все свойства класса. –

+0

Спасибо, хотя – UnforgivenX

 Смежные вопросы

  • Нет связанных вопросов^_^