ScriptHookDotNet的示例:
头等舱:
public sealed class Vehicle : GTA.base.HandleObject
//Member of GTA
public abstract class HandleObject : GTA.base.Object
//Member of GTA.base
public abstract class Object
//Member of GTA.base
第二课:
public sealed class World
//Member of GTA
使用的方法:
public static GTA.Vehicle CreateVehicle(GTA.Vector3 Position)
您无法使用以下方式从Vehicle创建对象:
Vehicle veh = new Vehicle();
因为Vehicle没有构造函数。
但你可以使用这段代码:
Vehicle veh = World.CreateVehicle(params);
它是如何制作的?
答案 0 :(得分:8)
构造函数是私有的,因此它们强制您使用特定方法来创建实例。这被称为工厂模式;在World类的内部,该方法具有使用构造函数创建Vehicle
的新实例的能力,但您不能。
编辑:如果你想创建这种功能,那么你会做这样的事情:
public class MyPublicClass
{
public MyPrivateClass CreateClass()
{
return MyPrivateClass.GetInstance();
}
}
public class MyPrivateClass
{
internal static MyPrivateClass GetInstance() { return new MyPrivateClass(); }
protected MyPrivateClass() { }
}
答案 1 :(得分:0)
附加说明:如果您可以修改代码,则可能需要在类中添加自定义公共构造函数。
认为不同; - )
答案 2 :(得分:0)
Vehicle类的构造函数不是公共的(受保护的,内部的,私有的),因为类创建者想要更好地控制对象的创建方式。
除了已经提到的Factory模式之外,单例模式还使用这种类创建方法来确保只创建特定类的一个实例(http://www.yoda.arachsys.com/csharp/singleton的.html)。
我也看到了Event Aggregator(http://msdn.microsoft.com/en-us/library/ff921122(v = pandp.20).aspx)类所使用的这种模式,它需要有关您事件的知识想要发布或订阅,这似乎是这里的情况。例如,如果您只是实例化了一个Vehicle类,那么World类如何知道将该车辆放入场景中或者在与其他物体交互时使用该车辆对象?而不是设计一些方法来将车辆添加到世界(即worldInstance.AddVehicle(..)我认为在这种情况下,World设计用于控制如何创建与World交互的对象。
有关工厂模式的详细信息,请参阅:http://msdn.microsoft.com/en-us/library/ee817667.aspx