我可以将类的可访问性限制为另一个类吗?

时间:2014-04-02 19:14:13

标签: c# class

例如,如果我有Class1Class2但我只希望Class3能够访问它们,我该如何设置它?

我正在研究多重继承,但在C#中它似乎并不可能。我希望我的演示层只能调用Class3Class3会根据Class1的构造函数中设置的属性调用Class2Class3

Class1()
{
  object GetData()
  {
  }
}

Class2()
{
  object GetData()
  {
  }
}

public Class3()
{
   bool mForClass2 = false;
   Class1 mClass1;
   Class2 mClass2;
   public Class3(bool forClass2)
   {
      mForClass2 = forClass2;
      mClass1 = New Class1();
      mClass2 = New Class2();
   }

   public object getdata()
   {
       if(mForClass2)
       {
         return mClass2.getdata();
       }
       else
       {
          return mClass1.getdata();
       }
   }
}

3 个答案:

答案 0 :(得分:3)

这正是私人内部类的目的。

public class Class3
{
    public enum Type { Order, Inventory }
    private interface IProvidesGetData{ object getData(); }
    private class Class1 : IProvidesGetData { /* ... */ }
    private class Class2 : IProvidesGetData { /* ... */ }

    //...
}

答案 1 :(得分:1)

要延伸clcto answered,您不需要全部在一个文件中。您可以使用partial classes

将其拆分
//In Class3.cs
public partial class Class3
{
    public enum Type { Order, Inventory }
    //...
}

//In IProvidedsGetData.cs
partial class Class3
{
    private interface IProvidesGetData
    {
        object getData(); 
    }
}

//In Class1.cs
partial class Class3
{
    private class Class1 : IProvidesGetData 
    {
        /* ... */ 
    }
}

//in Class2.cs
partial class Class3
{
    private class Class2 : IProvidesGetData 
    {
        /* ... */ 
    }
}

答案 2 :(得分:0)

同时制作Class1Class2 internal,并将public Class3放在同一个包中。

这会限制前两个对该包的可见性(主要是:Class3),而class3仍然是公开的。

当然,不要添加任何[InternalsVisibleTo]内容。

正如其他人所说,你也可以使用几个不同的private类,但这会给你一个大的源文件:不方便使用。使用此方法,您可以将其拆分为多个文件。

根据您的评论,您可以进行如下设置:

public enum CrudAction {
    Add, Update, Get
}

public class UIController { 
    public void Perform(CrudAction action) {
        switch(action){
            case CrudAction.Add: new AddAction().Perform(); break;
            case CrudAction.Get: new GetAction().Perform(); break;
            case CrudAction.Update: new UpdateAction().Perform(); break;
            default: throw new ArgumentException();
        }
    }
}

internal interface IAction {
    void Perform();
}

internal class AddAction : IAction { }
internal class GetAction : IAction { }
internal class UpdateAction : IAction { }

现在所有内容都分为多个文件,您只能使用

访问它
new UIController().Perform(CrudAction.Update);