防止在 C# 中从除基于 class 的任何地方实例化派生 class

Prevent instantiating derived class from anywhere except based class in C#

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# 无法编译,因为基础class 无法访问派生-class 构造函数。有没有不同的方法来完成这个?基本上,我想防止公开实例化 derived-class。

最简单的方法可能是使您的实现 private classes inside the base class:

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 特定的成员 - 但在许多情况下这很好。

如果您不介意同一程序集中的其他代码访问子classes,另一种方法是将它们设为内部classes。这是我在 Noda Time 中使用的一种方法,例如 - 我有多个 CalendarSystem 子 class,但客户(在程序集之外)只知道工厂 methods/properties在 CalendarSystem 本身。