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