防止在C#中除基础类之外的任何地方实例化派生类

时间:2015-01-15 17:03:14

标签: c# instantiation derived-class base-class

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#无法编译,因为基类无法访问派生类构造函数。有没有不同的方法来实现这一目标?基本上,我想阻止公开实例化派生类。

1 个答案:

答案 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本身内的工厂方法/属性。