Добавление пользовательского свойства в общую проблему управления - PullRequest
0 голосов
/ 08 февраля 2012

Я хотел бы знать, есть ли лучший способ реализовать интерфейс в пользовательском элементе управления.Я реализую Интерфейс в пользовательском элементе управления кнопками, и для ссылки на реализованное свойство мне нужно преобразовать Button в тип интерфейса, чтобы достичь его.

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

namespace WorkBench
{
    public partial class Form1 : Form
    {
        //Binding bind;

        public Form1()
        {
            InitializeComponent();

            MyButton btn = new MyButton();
            btn.Myproperty = "";
            ((MyInterface)btn).MyProp = "";
            btn.MyProp = "Not Available";//This give compile error, MyProp not defined
        }


    }

    public class MyButton : System.Windows.Forms.Button, MyInterface
    {
        public string Myproperty
        {
            get { return null; }
            set { }
        }
        string MyInterface.MyProp
        { get { return null; } set { } }


    }

    public interface MyInterface
    {
        void MyOtherPropoerty();

        string MyProp
        {
            get;
            set;
        }

    }
}

1 Ответ

1 голос
/ 08 февраля 2012

Похоже, вы ожидаете, что интерфейс сохранит набор значений. Интерфейс - это просто контракт, который класс должен реализовать всем своим членам. Даже если вы закомментируете строку, которая выдает ошибку, вы получите ошибку во время компиляции, что ваш класс MyButton не реализует все члены MyInterface.

Вам нужно реализовать string MyProp в вашем MyButton классе.

public class MyButton : System.Windows.Forms.Button, MyInterface
{
    public string MyProperty
    {
        get { return null; }
        set { /* ??? */ }
    }
    public string MyProp { get; set; } // <------ Implement string MyProp
}

Однако, если вы на самом деле пытаетесь разделить одно свойство между несколькими классами, вы можете вместо этого использовать базовый класс:

public class MyControlBase
    : System.Windows.Forms.Button
{
    public string MyProp { get; set; }
}

public class MyButton : MyControlBase
{
    public string MyProperty { get; set; }
}

-

void Example()
{
    var btn = new MyButton();
    var property = btn.MyProperty;
    var prop = btn.MyProp;
}
...