我们说我有一个对象类(widgetBlue
)。此对象类实现接口(iWidgetBlue
)并从抽象类(widget
)继承。 widgetBlue
没有明确编码的构造函数,并且具有对其执行操作所需的信息。
我希望能够在widgetBlue
中创建WidgetService
的实例以返回给使用者,以便他们可以使用它但不允许使用者创建{{1}的实例突然出现。 widgetBlue
需要能够创建新的WidgetService
并实例化其属性。
所以这没关系:
widgetBlue
但这不合适:
WidgetBlue retVal = SomeRemoteMethodThatReturnsAWidgetBlue();
编辑:此外,小部件对象都在他们自己的项目中,并由消费者和服务引用。
我该怎么做?
答案 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,而是隐藏抽象背后的更高实现的实际选择。