2011-08-15 57 views
2

来自实例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 veh = new Vehicle(); 

因为车辆没有构造函数。

但是你可以使用此代码:

Vehicle veh = World.CreateVehicle(params); 

它是如何做?

+0

参见[此FAQ元上堆栈溢出(http://meta.stackexchange.com/q/22186/156418)用于格式化代码的技巧 –

+0

你能展示一些来自'代码World.CreateVehicle' –

回答

8

构造函数是私有的,所以他们强迫你使用特定的方法来创建一个实例。这被称为工厂模式;从内部到世界级,该方法有能力用构造函数创建Vehicle的新实例,但不能。

编辑:如果你想创建这样的功能,那么你会做这样的事情:

public class MyPublicClass 
{ 
    public MyPrivateClass CreateClass() 
    { 
     return MyPrivateClass.GetInstance(); 
    } 
} 

public class MyPrivateClass 
{ 
    internal static MyPrivateClass GetInstance() { return new MyPrivateClass(); }   

    protected MyPrivateClass() { } 
} 
+0

+1:该死的 - 你到了那里第一 –

+0

我怀疑它是这样的,但后来它听起来像他创造了这个代码自己+1的字里行间!。 –

+0

如何在不使用内部函数的情况下使用其他类的私有构造函数?可能吗?你可以发布一些例子,它是从内部看的吗? – damned

0

附加注释:如果你可以修改代码,你可能要添加自定义的公共构造到你的课程。

想的不一样;-)

0

Vehicle类的构造函数是什么,但公众(受保护的,内部的,私有的)设计,因为类创作者想有过对象是如何被创造更好的控制。

除了已经提到的Factory模式之外,singleton模式还使用这种类创建方法来确保只创建一个特定类的一个实例(http://www.yoda.arachsys.com/csharp/ singleton.html)。

我还看到了需要关于事件知识的Event Aggregator(http://msdn.microsoft.com/zh-cn/library/ff921122(v = pandp.20).aspx)类使用的此模式你想发布或订阅,这似乎是这里的情况。例如,如果您只是实例化Vehicle类,那么World类会如何知道将该车辆放入场景中,或者如何在与其他对象交互时使用该车辆对象?而不是设计一些方法将车辆添加到世界(即worldInstance.AddVehicle(..)我认为在这种情况下,世界的目的是控制如何创建物体与世界互动。

有关工厂的更多信息模式参见:http://msdn.microsoft.com/en-us/library/ee817667.aspx

相关问题