【问题标题】:c# Main Form Implementing an Interfacec#主窗体实现一个接口
【发布时间】:2018-07-03 19:08:38
【问题描述】:

我在主窗体上实现接口时遇到问题。这个想法是有一个接口,一个将消息发送到接口的控制器类和实现接口的主窗体。这将被另一个类的对象用来“告诉”主窗体更新某些内容。我遇到的问题是我无法弄清楚如何将我的主表单分配给控制器类中接口类型的实例变量。如果我没有 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();
    }
}

【问题讨论】:

    标签: c# visual-studio oop interface


    【解决方案1】:

    问题是 Form1 在您的 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();
    }
    

    【讨论】:

    • 是的,就是这样。谢谢大家的帮助!
    • 由于我们的答案基本相同,而且相隔一分钟,所以我删除了我的答案,并为你的答案点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多