我是否可以限制对程序集中类的直接访问,但可以将其作为子类使用

时间:2018-03-14 14:19:21

标签: c# oop

我想知道这是否可能

我有一个程序集,其中定义了两个类。

public class Foo
{
    private Bar _Bar;
    public Bar get { return _Bar ?? (_Bar = new Bar(this.Context)); }
}

internal class Bar
{
    public void DoSomething() { }
}

然后是一个单独的第三方程序,它做了类似的事情

public class SomeClass
{
    public void ThisShouldWork()
    {
        Foo _Foo = new Foo();
        _Foo.Bar.DoSomething();
    }

    public void ThisShouldNotWork()
    {
        Bar _Bar = new Bar();
        Bar.DoSomething();
    }
}

有没有办法可以停止Bar类的实例化,但允许它们通过Foo访问?

这个例子中的错误将是"属性类型Bar的可访问性低于属性Foo.Bar"

1 个答案:

答案 0 :(得分:4)

这里有两种可能的解决方案(可能更多?)。第一个是基于我的评论:

  

Bar必须是公开的,但其构造函数不是。

public class Bar
{
    internal Bar() { }
    public void DoSomething() { }
}

这样,Bar只能由其父程序集中的类构建。

基于@ Sinatr评论的第二个解决方案:

  

将公共接口IBar添加到Bar并将其公开。

public interface IBar 
{
    void DoSomething();
}

internal class Bar : IBar
{
    public void DoSomething() { }
}

然后相应地修改Foo

public class Foo
{
    private IBar _Bar;
    public IBar Bar { get { return _Bar ?? (_Bar = new Bar(this.Context)); } }
}