可以创建只能由某些对象创建的类吗?

时间:2016-03-17 19:27:51

标签: c# object inheritance

我们说我有一个对象类(widgetBlue)。此对象类实现接口(iWidgetBlue)并从抽象类(widget)继承。 widgetBlue没有明确编码的构造函数,并且具有对其执行操作所需的信息。

我希望能够在widgetBlue中创建WidgetService的实例以返回给使用者,以便他们可以使用它但不允许使用者创建{{1}的实例突然出现。 widgetBlue需要能够创建新的WidgetService并实例化其属性。

所以这没关系:

widgetBlue

但这不合适:

WidgetBlue retVal = SomeRemoteMethodThatReturnsAWidgetBlue();

编辑:此外,小部件对象都在他们自己的项目中,并由消费者和服务引用。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您可以在WidgetBlue中创建一个无参数构造函数,并将其设置为具有internal访问修饰符。这样,您只能从同一个程序集中的类(例如您的WidgetService类)创建新实例,而不能从您的消费者那里创建,我假设它是一个外部程序集。

答案 1 :(得分:2)

我通常通过隐藏其他程序集中的具体类来完成这样的事情。将WidgetBlue设为内部类,然后您可以从创建WidgetFactory的{​​{1}}提供实例(您可以使用IWidget方法,并且可以轻松地将其扩展为如果你愿意,也可以提供红色的。这完全将客户端与具体实现分离。它被称为界面隔离原则。

BuildBlue()

在其他一些项目中:

namespace Widgets
{
    public interface IWidget
    {
    }

    internal abstract class Widget : IWidget
    {
    }

    internal class BlueWidget : Widget
    {
    }

    public class WidgetFactory
    {
        public IWidget BuildBlue()
        {
            return new BlueWidget();
        }
    }
}

答案 2 :(得分:0)

更好的方法是使用接口,因此具体类从消费者中抽象出来,如果将具体类标记为内部类,则甚至隐藏。接口是契约,因此没有接口实例的概念。接口构造函数。

那么你的榜样就是。

internal class WidgetBlue : IWidgetBlue {}

IWidgetBlue retVal = SomeRemoteMethodThatReturnsAIWidgetBlue();

这是不可能的

IWidgetBlue retVal = new IWidgetBlue();

它还允许您在将来更改基础实现或根据需要扩展它。

答案 3 :(得分:0)

您可以使用构建器模式执行此操作:

public Builder
{
    bool _prop = false;
    public Builder WithProperty(bool prop)
    {
        _prop = prop; 
         return this;
    }
    public Widget Build(){ 
        if(prop)
           return new FooWidget();
        else 
           return new BarWidget();
    }   
}

public abstract class Widget()
{
}

public class FooWidget: Widget{}
public class BarWidget: Widget{}

您无法实例化抽象Widget,而是隐藏抽象背后的更高实现的实际选择。