Вы можете создать объект класса, используя только второй класс (первый класс не имеет конструктора?) - PullRequest
2 голосов
/ 15 августа 2011

Пример из 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);

Как это сделано?

Ответы [ 3 ]

8 голосов
/ 15 августа 2011

Конструктор является закрытым, поэтому они заставляют вас использовать определенный метод для создания экземпляра.Это известно как фабричный образец;Внутри класса World этот метод способен создавать новый экземпляр Vehicle с помощью конструктора, но вы не можете.

РЕДАКТИРОВАТЬ: Если вы хотите создать такую ​​функциональность, то вы бы сделали что-то вроде этого:

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

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

    protected MyPrivateClass() { }
}
0 голосов
/ 15 августа 2011

Конструктор класса Vehicle не является публичным (защищенным, внутренним, закрытым) по своему дизайну, потому что создатели класса хотели иметь более точный контроль над тем, как создавались объекты.

В дополнение к уже упомянутому шаблону Factory шаблон синглтона также использует этот метод создания класса, чтобы обеспечить создание только одного экземпляра определенного класса (http://www.yoda.arachsys.com/csharp/singleton.html).

Я также видел этот шаблон, используемый агрегатором событий (класс http://msdn.microsoft.com/en-us/library/ff921122(v=pandp.20).aspx)), которому нужны знания о событиях, которые вы хотите опубликовать или подписаться, что, как представляется, имеет место здесь. Например, если вы просто создали экземпляр Vehicle класс, как бы класс World узнал, чтобы поместить это транспортное средство на сцену или использовать этот объект транспортного средства при взаимодействии с другими объектами? Вместо разработки какого-либо метода добавления транспортного средства в мир (например, worldInstance.AddVehicle (..), я думаю, в этом случае Мир был разработан для управления созданием объектов, взаимодействующих с Миром.

Для получения дополнительной информации о фабричном образце см .: http://msdn.microsoft.com/en-us/library/ee817667.aspx

0 голосов
/ 15 августа 2011

Дополнительный комментарий: если вы можете изменить код, вы можете добавить в ваши классы открытый конструктор.

Думай иначе; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...