Условно создать экземпляр класса в C # - PullRequest
3 голосов
/ 13 июля 2011

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

Я пытаюсь создать экземпляр класса для условий.Это будет выглядеть так:

int Airplane = 195;

if (Airplane == 190)
    _E190 Aircraft = new _E190();

else if (Airplane == 195)
    _E195 Aircraft = new _E195();

У меня есть оба класса, но я бы хотел использовать ключевое слово «Самолеты», чтобы мне не приходилось создавать несколько частей кода для каждого класса.Я также обнаружил, что множественное наследование (которое, по моему мнению, должно сработать) не доступно в C #, и я относительно новичок в этом языке.

До сих пор я реализовал экземплярКласс, как я хочу, но я не могу использовать переменные, объявленные внутри каждого класса.Я сделал это:

    int Airplane = 195;

    var Aircraft = Activator.CreateInstance( (Airplane == 195) ? typeof(_E195) : typeof(_E190));
    MessageBox.Show(Aircraft.GetType().ToString());

MessageBox правильно показывает тип, но, опять же, я не могу получить доступ к самому классу, используя объект "Самолет".Я уверен, что есть и другие способы сделать это, но любой из них мне подойдет.

Спасибо!

Ответы [ 3 ]

12 голосов
/ 13 июля 2011

Я так понимаю, что каждый из них наследуется от чего-то другого, и поэтому вам нужно множественное наследование?

Создайте интерфейс (IAircraft) и попросите их обоих реализовать его.

interface IAircraft {
    /* Common methods here */
}

class _E190 : TheParentClass, IAircraft {
    /* Your code */
}

class _E195 : TheOtherParentClass, IAircraft {
    /* Your code */
}

/* ... */

int Airplane = 195;
IAircraft Aircraft;

if (Airplane == 190)
    Aircraft = new _E190();
else if (Airplane == 195)
    Aircraft = new _E195();

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

4 голосов
/ 13 июля 2011

Почему бы вам не определить что-то вроде

public abstract class Aircraft
{
}

public class _E190 : Aircraft
{
}


public class _E195 : Aircraft
{
}

, а затем сделать следующее:

Aircraft Aircraft;
int Airplane = 195;

if (Airplane == 190)
    Aircraft = new _E190();

else if (Airplane == 195)
    Aircraft = new _E195();

РЕДАКТИРОВАТЬ: Кроме того, как предлагают другие, вы можете вместо этого использовать интерфейсабстрактного класса.Обратите внимание, что в этом случае вам придется дважды определить все общие свойства и методы, если они есть.

2 голосов
/ 13 июля 2011

Чтение по шаблону фабрики объектов

...