public abstract class Vehicle
{
public static GetVehicle()
{
if (Context.IsMountain())
{
return new Truck();
}
else
{
return new Car();
}
}
}
public class Car : Vehicle
{
// Prevent creating Car directly
private Car() { }
}
public class Truck : Vehicle
{
// Prevent creating Truck directly
private Truck() { }
}
使用上面的代码,C#无法编译,因为基类无法访问派生类构造函数。有没有不同的方法来实现这一目标?基本上,我想阻止公开实例化派生类。
答案 0 :(得分:4)
最简单的方法可能是在基类中实现私有类:
public abstract class Vehicle
{
public static Vehicle GetVehicle()
{
if (Context.IsMountain())
{
return new Truck();
}
else
{
return new Car();
}
}
private class Car : Vehicle {}
private class Truck : Vehicle {}
}
这会阻止客户使用任何Car
特定的成员 - 当然 - 但在很多情况下这样做很好。
另一种方法是,如果您不介意访问子类的同一程序集中的其他代码,则只需将它们设为内部类。这是我在Noda Time中使用的方法,例如 - 我有多个CalendarSystem
子类,但客户端(在程序集外部)只知道CalendarSystem
本身内的工厂方法/属性。