在C#中使用接口的问题

时间:2012-08-13 21:04:07

标签: c# interface

我正在尝试为我正在创建的类创建一个设置,因此在创建它时可以为它设置一个管理器类,并且可能需要通过接口调用该类中的函数

这些调用并不总是必需的,并且管理器可能并不总是调用此类的类,因此一个简单的返回值并使用它来形成管理器类不符合要求。

我要做的是遵循代码。 (试图剥离尽可能多的不必要的东西)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    interface Itester
    {
        void LoadTest();
    }


    public partial class Form1 : Form, Itester
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {

            World testWorld = new World();
        testWorld.SetManager(this);
            testWorld.InitializeWorld();

        }


        void Itester.LoadTest()
        {
            //random action I want run
            label1.Text = "Ran LoadTest()";
        }

    }


    public class World
    {
        Itester worldManager;

        public World()
        {
            InitializeWorld();
        }

        private void InitializeWorld()
        {
            worldManager.LoadTest();
        }

        public void SetManager(Itester test)
        {
            worldManager = test;
        }

    }

}

我基于它得到了这个错误。该错误指的是“世界级的公共空白”

错误1可访问性不一致:参数类型'WindowsFormsApplication1.Itester'不如方法'WindowsFormsApplication1.World.SetManager(WindowsFormsApplication1.Itester)'XYZ位置Form1.cs 316 21封建世界

我期望发生的事情是。

Form1类创建World Class的本地实例,然后运行其构造函数(什么也不做),然后将其自身设置为Manager(理论上可以是实现Itester接口的另一个类),最后再次调用World Class并要求它初始化世界,我希望世界级调用Form1实例并让它更新按钮上的标签。

lvl1:Form1 - > lvl2:世界 - > lvl3:Form1(或其他经理) - >返回void到lvl2:World - >将void返回到lvl1:Form1

我错过了什么,为什么这不起作用?

1 个答案:

答案 0 :(得分:8)

您的界面没有辅助功能修饰符,因此假设为internal。将其更改为公开:

public interface Itester
{
    void LoadTest();
}

您需要执行此操作的原因是因为方法SetManager是公共的,因此任何可以使用SetManager方法的人也必须能够看到该接口。

  

现在我只需要找出它的工作原理

考虑可以从任何程序集调用SetManager,因为它是公共的。因此,如果某人正在创建程序集,他们可以引用您的程序集并致电worldInstance.SetManager。我们称之为程序集BigHappyAssembly。

现在考虑SetManager的第一个参数是ITester,但它是内部的。当BigHappyAssembly尝试调用SetManager时,会出现一个问题:我想要作为第一个参数提供什么?它无法访问ITester类型,所以它不知道这是第一个参数是什么。

为防止这种情况发生,编译器会阻止您引入此问题。它警告你,你创建了一个公众成员,任何人都可以打电话,但不是每个人都能知道参数是什么。