【发布时间】:2017-04-08 04:58:10
【问题描述】:
这仅用于 OOP 的学习目的。
我有一个希望看起来像这样的继承层次结构:
`
-> 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
`
基类是Food,所有水果/蔬菜/牛奶/谷物/肉类都是扩展食品。那么fruit类可能有一个Apple,Banana,Lemon等类型的孩子。因此Apple,Banana,Lemon将扩展水果,扩展食物。
现在您可以想象,世界上有很多不同类型的水果/蔬菜/牛奶/谷物/肉类。太多了,无法为每个单独的课程。
我想要完成的是:
- 创建一个动态类,其标识的 ClassName 类型将根据用户输入的内容而改变。
功能看起来类似于这样:
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 之类的东西。
【问题讨论】:
-
我觉得你还没有类的概念,Banana是水果的名字,不应该是类。所以它宁愿是一个位于水果类中的名称属性。与水果的类型相同,将是一个属性。想想人。 Person 将是一个类......但他的名字“John”不会。将类视为 thing 而不是 thing 本身的规范。
-
我个人不会这样做。这是一个练习,看看这种类型的功能是否可行。我正在研究 C# 动态类,并想知道该特定部分是否包含我所要求的内容。
-
我同意@Jim 的观点,通常在OOD 中,一个类具有一组独特的参数和函数,如果两个对象不应该具有不同的能力,那么它们应该是同一个类。例如,如果我们有一个类
Drinks的名称和函数void drink(),它将涵盖水、牛奶、苏打水等。您可以从用户输入中加载名称,而无需尝试创建派生即时输入。
标签: c# class dynamic classname