【问题标题】:You can create class object only using second class (first class doesn't have constructor?)您只能使用第二类创建类对象(第一类没有构造函数?)
【发布时间】:2011-08-15 15:20:03
【问题描述】:

来自 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);

它是如何制作的?

【问题讨论】:

标签: c# class constructor


【解决方案1】:

构造函数是私有的,所以它们强制你使用特定的方法来创建一个实例。这被称为工厂模式;在 World 类内部,该方法可以使用构造函数创建 Vehicle 的新实例,但您不能。

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

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

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

    protected MyPrivateClass() { }
}

【讨论】:

  • 我怀疑是这样的,但听起来像是他自己创建了这段代码。 +1 用于在字里行间阅读。
  • 如何在不使用内部的情况下使用其他类的私有构造函数?是否可以?你能发布一些从内部看的例子吗?
  • @damned - 我会假设构造函数实际上是内部的而不是私有的。 Vehicle 也有可能拥有 World.CreateVehicle 正在访问的内部工厂方法。
  • 我同意。构造函数可能是internal。但是,理论上您应该能够通过反射创建一个新实例,但这有点进入灰色地带。如果您需要创建车辆,您可能应该使用工厂方法。
  • 不不,这是我尝试复制到我的代码的示例。我希望类 1 只能由类 2 方法创建,但我不知道代码应该是什么样子。
【解决方案2】:

附加注释:如果您可以修改代码,您可能希望为您的类添加一个自定义的公共构造函数。

思考不同;-)

【讨论】:

    【解决方案3】:

    Vehicle 类的构造函数在设计上绝不是公共的(受保护的、内部的、私有的),因为类创建者希望更好地控制对象的创建方式。

    除了已经提到的工厂模式之外,单例模式也使用这种类创建方法来确保只创建特定类的一个实例(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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多