2011-08-15 54 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

相關問題