【问题标题】:Can I restrict the accessibility of a class to just another class?我可以将一个类的可访问性限制为另一个类吗?
【发布时间】:2014-04-02 19:14:13
【问题描述】:

例如,如果我有 Class1Class2 但我只希望 Class3 可以访问它们,我将如何进行设置?

我正在研究多重继承,但在 C# 中似乎不可能。我希望我的表示层只调用Class3,而Class3 将根据Class3 的构造函数中设置的属性调用Class1Class2

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();
       }
   }
}

【问题讨论】:

  • 听起来像是一个接口的工作。您的 forClass2 bool 没有多大意义。你能提供更多关于你想要做什么的信息吗?什么背景?
  • 我同意 LarsTech,我发现了这个,我认为它会帮助你 stackoverflow.com/questions/18438196/…
  • ...这正是内部类的用途。
  • 我的老板几乎希望有一个设置,我们有一个电路基类,当启动订单或库存时,这个类将采用枚举。然后,基类将决定从库存或订单(class1 和 class2)中添加、更新或获取数据

标签: c# class


【解决方案1】:

这正是私有内部类的设计目的。

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

    //...
}

【讨论】:

  • 这听起来像是我需要的解决方案,只是不想将所有代码塞进 1 个文件中,但它可以工作。感谢您的帮助。
  • @user2493906 它不需要是一个文件,将Class3 声明为public partial class Class3 并且您可以拥有多个文件都具有Class3 的数据它们都只需要在同一个程序集中.示例见my answer
  • @clcto 是 VB 而不是 C#?还有ProvidesGetData真的应该是IProvidesGetdata
  • @ScottChamberlain 正如我使用implements 所看到的,我认为这是一个java 问题,已更新。
【解决方案2】:

要扩展 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 
    {
        /* ... */ 
    }
}

【讨论】:

    【解决方案3】:

    同时制作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);
    

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2014-08-26
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多