C # - Скрытие всех методов класса UserControl от производного - PullRequest
1 голос
/ 19 ноября 2009

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

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

public class CustomControl : UserControl

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

CustomControl cControl = new CustomControl();

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

Ответы [ 7 ]

6 голосов
/ 19 ноября 2009

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

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

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

...

ICustomControl cControl = new CustomControl();

Тогда intellisense показывает только элементы MyProperty и Object (и методы расширения, если таковые имеются).

EDIT:

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

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

4 голосов
/ 19 ноября 2009

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

1 голос
/ 19 ноября 2009

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

  1. Использование EditorBrowsableAttribute скроет свойства от intellisense
  2. Использование BrowsableAttribute скроет свойства из сеток свойств
  3. Скрытие самих свойств с помощью «private new» скроет их от всего

Что нужно учитывать:

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

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

1 голос
/ 19 ноября 2009

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

1 голос
/ 19 ноября 2009

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

0 голосов
/ 19 ноября 2009

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

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

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

0 голосов
/ 19 ноября 2009

Не наследуйте UserControl, вместо этого наследуйте Control.

...