1

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

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

我想做的是遵循代码。(试图尽可能多地去除不必要的东西)

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 Feudal World

我所期望的就是这样。

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

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

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

4

1 回答 1

8

您的界面没有可访问性修饰符,因此假定为internal. 将其更改为公开:

public interface Itester
{
    void LoadTest();
}

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

现在我只需要弄清楚它为什么有效

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

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

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

于 2012-08-13T21:06:08.927 回答