2016-11-24 79 views
0

这严格用于OOP的学习目的。仅在C#中动态类名 - >在运行时生成

我有继承的是要像这样的层次:

`  
    -> Fruit->0-n fruits classes 
    -> Vegetable -> 0-n vegetable classes 
Food-> Milk -> 0-n milk classes 
    -> Grain -> 0-n grain classes 
    -> Meat -> 0-n meat classes 
`  

的基类是食品,所有的水果/蔬菜/牛奶/粒/肉类延长食品。然后水果班可能有一个苹果,香蕉,柠檬型等孩子。所以苹果,香蕉,柠檬将延长水果,延长食物。

现在,你可以想象,世界上有很多不同类型的水果/蔬菜/奶/谷类/肉类。为每个人制作单独的课程太多。

我想做到的是:

  1. 创建动态类,其识别类名类型依据是什么在用户输入将改变。

的功能类似于这样:

public class ${ClassName} : ${Category}{ 
//Imagine I can put a variable name right where ${ClassName} is that holds Banana. 
//I'd then determine ${Category} simply from the location that the user entered the value Banana. 

//I'd now have: 
} public class Banana : Fruit{ 

} 

在这种情况下,我不关心的类中的方法/变量/属性的任何变。他们都将保持不变,我只希望ClassName更改为适当的名称。

这可能吗?还是我在童话般的土地?理想情况下,上述方法成功后。我希望能够使用object.getType()获得ClassName,并让它返回Apple,Banana,Lemon之类的东西,如果用户输入其中的一个。

+1

我认为你还没有类的概念,*香蕉*是一个水果的名称,不应该是一个类。所以它将成为水果类中的一个名称属性。同样的水果将是一种财产。想想人。 *人*将是一个班级,但他的名字“约翰”不会。看起来像它是一个*事物类,而不是一个*事物本身的规范。 – Jim

+0

我个人不会这样做。这是一个练习,看看这种类型的功能是否可能。我正在研究C#动态类,并想知道这个特定的部分是否持有我的要求。 – Jetompki

+1

我同意@Jim,通常在OOD中,一个类有一组独特的参数和函数,如果两个对象不应该有不同的能力,它们应该是同一个类。例如,如果我们有一个名为“Drinks”的课程,并且功能是'void drink()',那么它将覆盖水,牛奶,苏打水等。您可以从用户输入中加载名称,而无需试图快速创建派生类型。 –

回答

0

基于Jim的评论,我认为你对类有错误的想法。理想情况下(取决于域),您希望使用Name的属性为Fruit基类建模。 “香蕉”是一种水果,“苹果”是一种水果......等等。

public class Fruit { 
    public string Name { get; set; } 
} 

如果您确实需要具体说明,可以创建使用Fruit作为基类的类。大概沿着浆果,核果,豆类等的线,那么你还是会希望有一个名称属性来定义水果的特定实例是什么“覆盆子”,“蓝莓”,...

public class Berry : Fruit { 
    // berry-specific properties 
} 

一旦您对类有更基本的了解并对其进行构造,以及具体和抽象类型之间的区别,我建议您查看Factory MethodAbstract Factory设计模式。那些描述的技术,如果你真的需要在运行时确定具体类型,你可以使用。

+0

我并不是声称这是在我的OP中做的好主意,或者是你应该做的。我知道我可以不那么具体,拿走我的层次结构中的第三层,然后让它简单地从用户那里获得输入,并将其直接插入水果/肉类/谷物/牛奶/蔬菜类中的变量。 我只问是否可能。 而我想这样做的原因是,一些水果可以有他们的附加属性。例如,有很多不同类型的苹果,(格兰尼史密斯,金冠,Honeycrisp,红美味等)。 – Jetompki

+1

一个书本答案,但在那种情况下,我会把重点放在继承的构造上(装饰模式)。 https://sourcemaking.com/design_patterns/decorator专注于确定一种特定类型的苹果是GrannySmith还是HoneyCrisp。甜度= 9,酸度= 4,或者你有什么。有可能有更好的方式来表示数据,而不是为“所有事物”创建新类 但是,您发布的问题是关于在运行时确定/创建具体类型,可以使用工厂模式。 –