c#主窗体实现接口

时间:2018-01-24 16:41:44

标签: c# visual-studio oop interface

我在主表单上实现界面时遇到了问题。我们的想法是拥有一个接口,一个将消息发送到接口的控制器类以及实现接口的主表单。这将由另一个类的对象用来“告诉”主要表单来更新某些内容。我遇到的问题是我无法解决如何将我的主窗体分配给控制器类中类型为interface的实例变量。如果我不是100%清楚,我道歉。以下类的示例:

主要表格

using System;
using System.Windows.Forms;

namespace InterfaceProject
{
    public partial class Form1 : Form, IMessage
    {
        public Form1()
        {
            InitializeComponent();
        }

        MessageController ctrl = new MessageController();

        private void Form1_Load(object sender, EventArgs e)
        {
            ctrl.Greeting();
        }

        public void Hello()
        {
            //Do some stuff to the form
            MessageBox.Show("Hello World");
        }
    }
}

控制器类

namespace InterfaceProject
{
    class MessageController
    {
        //Instance Variables
        private IMessage messageClient;

        //Constructor
        public MessageController()
        {
            messageClient = Form1;
        }
        public void Greeting()
        {
            messageClient.Hello();
        }
    }    
}

接口

namespace InterfaceProject
{
    interface IMessage
    {
        void Hello();
    }
}

1 个答案:

答案 0 :(得分:3)

问题是FormIn1在MessageController类中不可用。您需要将它作为参数传递给MessageController构造函数或创建一个setter函数...

using System;
using System.Windows.Forms;

public partial class Form1 : Form, IMessage
{
    private MessageController ctrl;

    public Form1()
    {
        InitializeComponent();
        ctrl = new MessageController(this);
    }    

    private void Form1_Load(object sender, EventArgs e)
    {
        ctrl.Greeting();
    }

    public void Hello()
    {
        MessageBox.Show("Hello World");
    }
}

class MessageController
{
    private IMessage messageClient;

    public MessageController(IMessageClient client)
    {
        messageClient = client;
    }
    public void Greeting()
    {
        messageClient.Hello();
    }
}

interface IMessage
{
    void Hello();
}