Создайте новый экземпляр подкласса, когда я не хочу знать его имя - PullRequest
1 голос
/ 26 апреля 2011

(я довольно новичок в C #, так что терпите меня, началось 2 дня назад)

Хорошо, вот общая структура и идея

namespace Tokenize{
    abstract class Token{
        public Base(object id){
            this.id = id;
        }
        private object id;
        public object Id
        { 
            get{...};
            set{...};
        }
        public abstract object PerformOperation(object a, object b);

    }

    class NumberNine: Base{
        public NumberNine(int num) : base(num){ }
        public override int PerformOperation(int a, int b);
    }

    class LetterT: Base{
        public LetterT(char letter) : base(letter){ }
        public override string PerformOperation(string a, char b);
    }
}
using Tokenize;
namespace Program{
    class MyProg{
         static void Main(string[] args)
         {
              Token token;
              Stack stack;
              //.....
              //Read some input
              string s = "T";
              //.....
              if(s==anonymousDerivedClassId){
                  //How do I come up with class LetterT and keep it anonymous?
                  Token token = new anonymousDerivedClass(); // 
                  stack.Push(token)
              }
              //.....
              //do some stuff
              //.....
              object a;
              object b;
              Token q = stack.Pop(token);
              q.PerformOperation(a,b);

         }
    }
}

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

Я даже не знаю, существует ли он?

Надеюсь, это не было слишком сложно ...

EDIT:

Я не хочу отслеживать все подклассы в основном ...

EDIT2 (Новый пример):

Рассмотрим:

    static void Main(string[] args)
    {
        Operator op;
        string s = "*";
        if(s==MulOperator.Identifier){
           op = new MulOperator();
        }
        else{
           op = new DivOperator();
        }

        perform(op);

    }
    static void perform(Operator op)
    {
        Console.WriteLine("Sum:{0}", op.PerformOperation(2.2,2.0));
    }

Где я хочу избавиться от new MulOperator() и MulOperator.Identifier с помощью более общего метода создания подкласса в этом случае Operator.

РЕДАКТИРОВАТЬ 3: *

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

1 Ответ

3 голосов
/ 26 апреля 2011
string s = "T";
string typeName = string.Empty;

// Determine whether s is a letter or digit
if (Char.IsDigit(s[0]))
{
    typeName = "Digit" + s;
}
else if (Char.IsLetter(s[0]))
{
    typeName = "Letter" + s;
}

// Get real type from typeName
Type type = Type.GetType(typeName);

// Create instance of type, using s as argument
object instance = Activator.CreateInstance(type, new object[] { s });

Вам придется отредактировать ваши конструкторы, чтобы они принимали string s в качестве параметра, и выполняли правильную проверку и анализ.

...