有没有办法控制哪些类可以访问类中的某些方法?

时间:2016-11-15 14:11:23

标签: c#

我还没有找到答案,所以我很好奇这样的事情是否可能。我们假设我有一个DataClass来保存该程序的各种数据。像这样的东西,例如:

public class DataClass
{
    int Data_One;
    int Data_Two;
    int Data_Three;

    public int GetOne();
    public int GetTwo();
    public int GetThree();

    public void SetOne();
    public void SetTwo();
    public void SetThree();
}

现在,让我们说我有另外两个类,类A和类B,两个都被实例化一次,并且这两个类都可以访问同一个{{1 }}。但是如果我希望这两个类具有对DataClass的不同访问权限呢?  我们想要DataClass能够阅读AData_One,但只能设置Data_Two,并且无法访问Data_One ,我希望课程Data_Three能够阅读和设置BData_Three,但无法访问Data_Two。这是否可以通过某种方式实现,如果是这样,最方便的方法是什么?

进一步阐述:在我的例子中,有2个类,但我正在寻找的是任意数量的类的通用解决方案,这允许我明确地定义每个类可以访问哪些方法,无论有多少其他类可以访问相同的方法。有点像有一个访问表'包含每个类可以访问哪些方法。我希望这是可持续发展的,因此更改可访问性权限不会有麻烦。

最栩栩如生的案例是拥有一个类,只有设置数据,其他几个,只能读取该数据,其余的则没有无论如何都可以访问它。所有这一切都不需要在类之间使用引用,instad使用“中心”和#39;数据对象。

我想出的一个想法是针对每个方法对Data_One中的调用者进行类型检查,并确定该类型是否可以访问该方法。最理想的是,如果DataClass会有某种DataClass方法,则返回一个带有对可访问方法的引用的对象或容器类型,尽管这听起来有点太过分了对我来说。

3 个答案:

答案 0 :(得分:4)

使用接口。你可以

interface ICanBeUsedOnlyByA {
  int Data_One { get; set; }
}
interface ICanBeUsedOnlyByB {
  int Data_Two { get; set; }
}

class DataClass : ICanBeUsedOnlyByA, ICanBeUsedOnlyByB {

}

然后你有

class A {
   public ICanBeUsedOnlyByA A { get; set; }

    public A (ICanBeUsedOnlyByA a){
       A = a;
    }
}

class B {
   public ICanBeUsedOnlyByA B { get; set; }

    public B (ICanBeUsedOnlyByB b){
       B = b;
    }
}

然后A只能访问int Data_One;Bint Data_Two; 我建议你阅读有关接口和抽象类的内容。

答案 1 :(得分:1)

基本上是接口:

public class DataClass : IAInterface, IBInterface
{
    int Data_One;
    int Data_Two;
    int Data_Three;

    public int GetOne();
    public int GetTwo();
    public int GetThree();

    public void SetOne();
    public void SetTwo();
    public void SetThree();
}

public class A
{
   public void SetA(IAInterface value)
   {
       //can only access whats in the interface
   }
}

public class B
{
   public void SetB(IBInterface value)
   {
       //can only access whats in the interface
   }
}

public interface IAInterface
{
    int GetOne();
    int GetTwo();
}

public interface IBInterface
{
    void SetOne();
    void SetTwo();
}

答案 2 :(得分:0)

在这种情况下我可以建议的一件事是将internal用于您想要限制访问的方法和属性,并将一个类放到另一个程序集中。您也可以按照其他答案中的建议使用接口,但在这种情况下最好明确地实现它们。