防止在 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
本身。
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
本身。