在C#中使用接口的问题

Tao*_*aoh 1 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;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

我本来期望发生的是那个.

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

lvl1:Form1 - > lvl2:World - > lvl3:Form1(或其他管理器) - >返回void到lvl2:World - > return void to lvl1:Form1

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

vcs*_*nes 8

您的界面没有辅助功能修饰符,因此可以使用它internal.将其更改为公开:

public interface Itester
{
    void LoadTest();
}
Run Code Online (Sandbox Code Playgroud)

您需要这样做的原因是因为该方法SetManager是公共的,因此任何可以使用SetManager方法的人也必须能够看到该接口.

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

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

现在考虑第一个参数SetManagerITester,但它是内部的.当BigHappyAssembly尝试调用SetManager时,会出现一个问题:想把它作为第一个参数给出什么?它无法访问该ITester类型,因此它不知道第一个参数是什么.

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