2017-12-30 11 views
0

"I"がすべてのパブリックメソッドにアクセスできるクラスを定義しようとしていますが、ユーザーが指定した関数にインスタンスを渡すとき、パブリックメソッドのサブセットこれらの線に沿って何か:C#でインスタンスをユーザープロシージャに渡すときメソッドの可視性を制限する

// usercl.cs 
class UserClass { 
    public void UserM1(); 
    public int UserM2(int x); 
} 

// mastercl.cs 
class MasterClass : UserClass { 
    public void MasterM3(float y); 
    public float MasterM4(int z); 
} 

// UserCode.cs 
... 
public void UserFunction(UserClass uc); 
... 

// Master.cs 
MasterClass mc = new MasterClass(); 
UserFunction((UserClass)mc); 

しかし、もちろん、上記実装され、ユーザーは単に(マスタークラス)にそれを改鋳して、マスターメソッドにアクセスすることができます。 UserClassを別の(ユーザー)名前空間に入れようとしましたが、これはUserFunctionへの呼び出しで "Cannnot型XからYへの変換"コンパイルエラーに遭遇しました。

複数のInterfaceインスタンス(IMaster/IUser)でさまざまなことを試みましたが、いずれも動作していないようで、抽象クラスを使用していくつかのスタブを使用しました。

DIDは自分のコード内でMasterClassを定義することで動作するように見えました。 UserFunctionを呼び出すときに「(UserClass)」にリキャストすることができ、ユーザーはMasterメソッドを認識できませんでした。しかし、そのようなクラスを(大量に)必要とするかもしれませんが、これは本当にプライマリプログラム/ファイルを混乱させるでしょう。私は、より良い/より良い/より簡単な方法があるかどうかを知ることに興味があります。

+0

「明示的インタフェース」を参照してください。インタフェースを内部にする。 – user2864740

+1

@ user2864740:どのように役立つか分かりません。具体的なクラスタイプにキャストできるものは、すべてにアクセスできます。 –

+0

@ JohnSkeetインターフェイスを明示的に実装し、内部インターフェイスを内部に保持する場合は使用しないでください。 (私は、分割されたアセンブリがあると仮定しましたが、 '内部'基本クラスのメンバを持つこともできます) – user2864740

答えて

1

継承を使用する代わりに、「本当にpublic」関数を実装するラッパークラスを作成します。そのラッパーは、保持されているインスタンス参照へのパラメータを単に渡します。ラッパーは内部型から派生していないので、キャストする能力に慣れていません。

+0

私はあなたのことを十分に理解していないかもしれませんが、主プログラムファイルに "マスター"実装を保持する必要はなくなりましたが、今はオブジェクト管理の問題があります。各ユーザーの個別のユーザー/マスターオブジェクトを処理します。これはコードの膨らみの問題を解決するかもしれませんが、私はもう少し "エレガントに"(できるだけ)扱いたいと思っているもののためにクルージュのようなものを紹介します。 – JudgeRoyBean

関連する問題