【问题标题】:Create a new instance of a subclass when I don't want to know the name of it当我不想知道它的名称时,创建一个子类的新实例
【发布时间】:2011-04-26 14:35:41
【问题描述】:

(我对 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);

         }
    }
}

我想创建一个我不想知道其名称的子类的新实例?

我“甚至不知道”它是否存在?

希望这不是太复杂...

编辑:

我基本上不想跟踪所有子类...

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:*

(解决方案) 我要试试A Generic Factory in C#, 看来这就是我想要实现的目标。

【问题讨论】:

  • 将字符串映射到工厂函数的字典应该可以正常工作。

标签: c# inheritance polymorphism tokenize


【解决方案1】:
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 作为参数,并进行正确的验证和解析。

【讨论】:

  • 对不起,您能否详细说明一下,我真的很想了解该代码的作用?它对我有什么帮助?
  • @Heandel 好的,知道了 =),问题是我不想知道有一个名为 NumberNine 的类,我只想知道它的 id 然后决定实例化它。这太难解释了。 XD
  • 这似乎不像被问到的。在我看来,OP 正在询问如何创建匿名类,采用 Java 风格。类似var numberNine = new Token() { override PerformOperation(...) {...} }
  • @Heandel 这是一个好的开始,我会看看我能做什么,不能做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2019-01-29
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多