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.cs316 21FeudalWorldよりもアクセスしにくい

私が期待していたのはそれでした。

Form1クラスは、ワールドクラスのローカルインスタンスを作成し、コンストラクターを実行し(何もしません)、マネージャーとして設定し(理論的には、Itesterインターフェイスを実装する別のクラスである可能性があります)、最後にワールドクラスを再度呼び出して要求します。ワールドを初期化するために、ワールドクラスが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からでも呼び出すことができると考えてください。したがって、誰かがアセンブリを作成している場合、その人はあなたのアセンブリを参照して、を呼び出すことができます。そのアセンブリをBigHappyAssemblyと呼びましょう。worldInstance.SetManager

ここで、の最初のパラメータがであると考えますSetManagerITester、これは内部です。BigHappyAssemblyがSetManagerを呼び出そうとすると、問題が発生します。最初のパラメーターとして何を指定すると思いますか?タイプにアクセスできないITesterため、それが最初のパラメーターであるかどうかはわかりません。

そもそもこれが起こらないようにするために、コンパイラーはこの問題の発生を阻止します。パブリックメンバーを作成したことを警告します。誰でも呼び出すことができますが、すべての人がパラメータを知ることができるわけではありません。

于 2012-08-13T21:06:08.927 に答える