我正在尝试为我正在创建的类创建一个设置,因此在创建它时可以为它设置一个管理器类,并且可能需要通过接口调用该类中的函数
这些调用并不总是必需的,并且管理器可能并不总是调用此类的类,因此一个简单的返回值并使用它来形成管理器类不符合要求。
我要做的是遵循代码。 (试图剥离尽可能多的不必要的东西)
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
我错过了什么,为什么这不起作用?
答案 0 :(得分:8)
您的界面没有辅助功能修饰符,因此假设为internal
。将其更改为公开:
public interface Itester
{
void LoadTest();
}
您需要执行此操作的原因是因为方法SetManager
是公共的,因此任何可以使用SetManager方法的人也必须能够看到该接口。
现在我只需要找出它的工作原理
考虑可以从任何程序集调用SetManager
,因为它是公共的。因此,如果某人正在创建程序集,他们可以引用您的程序集并致电worldInstance.SetManager
。我们称之为程序集BigHappyAssembly。
现在考虑SetManager
的第一个参数是ITester
,但它是内部的。当BigHappyAssembly尝试调用SetManager时,会出现一个问题:我想要作为第一个参数提供什么?它无法访问ITester
类型,所以它不知道这是第一个参数是什么。
为防止这种情况发生,编译器会阻止您引入此问题。它警告你,你创建了一个公众成员,任何人都可以打电话,但不是每个人都能知道参数是什么。