2013-09-18 4 views
0

Представьте себе следующие два класса:Создание объектов различных типов с использованием единой подписи

class A 
{ 
    public A() 
    { 
    } 
} 
class B : A 
{ 
    public B() 
    { 
    } 
} 

Возможно ли для меня, чтобы определить, или же интерфейс, таким образом, что силы класса B, чтобы иметь без параметров конструктор? Или, более обобщенный, конструктор (или статический метод), который способен создать экземпляр типа B с заданной сигнатурой?

я не хочу ограничить класс B, чтобы быть только конструктивны, используя эту подпись, но я хочу быть уверены, что класс B может быть построен с этой подписью (будь то Беспараметрическим, или с указанием определенных параметров).

Чтобы быть ясным: я не ищу решение, которое потребует от меня использования Reflection или любого другого метода, чтобы понять это во время выполнения (у меня нет проблем с ним, но это сделает код менее читаемый и, как правило, кажется плохим в этом случае).

Есть ли способ сделать это?

я написал сообщение в блоге, который идет более углубленного о том, что я пытаюсь достичь here

ответ

1

Там нет интерфейса или базового типа, которые можно применить к типу, чтобы убедиться, что он имеет конструктор без параметров. Только контекст, в котором вы можете сделать такой contraint это общие ограничения:

public static void Foo<T>() 
    where T : new() {} 

В таком случае единственными видами, которые могут быть использованы с Foo должен иметь конструктор без параметров.

+0

Это также можно использовать, если я хочу, чтобы обеспечить соблюдение, что объект есть, скажем, всегда конструктор, который принимает один аргумент Список типа? Или любое другое число и сочетание аргументов, которые я хотел бы получить? И если конструктор невозможен, может быть предусмотрено, что у класса есть статический метод, строящий сам экземпляр (конечно же, он может заставить определенные параметры быть приняты этим методом)? Если нет, это не подходит для моего дела, все равно спасибо за быстрый ответ :) – user2791287

+0

@ user2791287 Это невозможно, нет. – Servy

+0

Отредактированный начальный вопрос со ссылкой на то, что я пытаюсь сделать, возможно, это дает более точное представление о том, что я хочу сделать, и, возможно, есть альтернативы, которые я упустил. O: – user2791287

0

Вы можете определить фабрику для экземпляров объектов типа A (и производных типов):

interface IFactory<T> where T : A 
{ 
    T Create(int i); 
    T Create(string s); 
    // and so on... 
} 

и требуют реализации фабрики, когда вы хотите создать объект.
Это позволит убедиться, что код вызова во время компиляции пытается создать объект с заданным набором параметров.

Конечно, нет ничего препятствия от NotImplementedException от бетона IFactory<T> реализация во время выполнения.

+0

Я подумал об этом, но на самом деле это не работает, поскольку даже фабрика должна предположить, что объект, который он создает, поддерживает только определенный способ его создания. Я не могу использовать фабрику для обеспечения того, чтобы я мог построить объект таким образом. Еще одна причина, по которой я не хочу этого делать, заключается в том, что классы, которые я пытаюсь ограничить, скомпилированы во время выполнения, а это означает, что я по существу вынуждаю каждый скриптовый класс также реализовывать фабрику. И даже тогда я не могу заставить сценарий разрешить мне создать фабрику определенным образом ... – user2791287

0

Это продолжение, поскольку я провел немного исследований и, по крайней мере, смог придумать ответ, который несколько удовлетворяет.

Итак, после копания в течение некоторого времени и попытки выяснить, как работает встроенная сериализация/десериализация в C#, я обнаружил, что у C# есть метод, называемый GetUninitializedObject(). Этот метод кажется взломом, поскольку он просто избегает вызова конструктора объекта в первую очередь, но он по крайней мере дает мне способ выполнить то, что я изначально хотел: возможность десериализации объекта произвольного типа. Используя это, я могу использовать методы для неинициализированных созданных объектов (и форсировать их реализацию через интерфейс).

Я считаю, что это соответствует моим потребностям, хотя оно не делает то, что я изначально хотел, это позволяет мне реализовать шаблон, который работает для моих целей.

С наилучшими пожеланиями

Смежные вопросы