【发布时间】:2021-10-19 15:49:52
【问题描述】:
我正在使用不同的粒子进行模拟。他们都有类似的 行为,都与其他潜在的粒子存储在同一个列表中 不同的子类型,并被系统的其余部分平等对待。因此,我创建了 Particle 类,并尝试了不同的多态方法。这是我大致想要实现的简化版本,用伪代码编写:
//Movement methods
Randomwalk() {//code}
Diffusion() {//code}
Steered_Motion() {//code}
//Special actions
Pollute() {//code}
Cleanup() {//code}
//Particles
Particle_Type Movement_Method Special_Action
Oil Diffusion() Pollute()
Sorbent Diffusion() Cleanup()
Packman_random Randomwalk() Cleanup()
Packman_steered Steered_Motion() Cleanup()
... (50 more rows)
我已经想到了三种方法来实现这一点,但其中两种只对少量粒子类型(
我尝试的第一个方法是定义一个具有不同粒子类型的 Enum,向 Particle 类添加一个 Field 来定义它是什么类型的粒子,并使用 switch 语句使用该字段来确定哪种运动方法和哪种特殊要调用的操作。
public class Particle {
public enum ParticleType: int {
Oil = 0,
Sorbent = 1,
//...etc
}
public readonly ParticleType TypeOfParticle;
Movement() {
switch(TypeOfParticle) {
case ParticleType.Oil:
Diffusion();
break;
case ParticleType.Sorbent:
Diffusion();
break;
}
}
}
但是,由于某些类型需要额外的字段,这会留下一堆仅由其中一种子类型使用的各种字段。此外,Enum 类型没有任何内置支持要求唯一性,这意味着如果未正确检查 Enum 定义的值分配,两种粒子类型最终可能会在 switch 语句中触发相同的情况。
第二种方法是使用继承。这里我仍然使用相同的 Particle 类,但每个粒子类型都是 Particle 类的子类。
public class Particle {
virtual public void Movement() {}
//Define methods
Randomwalk() {//some code}
Diffusion() {//some code}
Steered_Motion() {//some code}
}
public class Oil: Particle {
override public void Movement() {
Diffusion();
}
}
public class Sorbent: Particle {
override public void Movement() {
Diffusion();
}
}
虽然这解决了只有某些类型的字段的问题,但它会创建一个包含大量类的非常长的列表。也许只有我一个人,但管理这个类型列表真的感觉像是一件苦差事。因此,我开始在第三种方法中寻找一些东西。
第三种理想的方法是使用 DataTable 创建表格,将所有不同的粒子类型作为行,将移动方法和特殊动作作为列。运行这些方法将使用委托来完成。不幸的是,DataTables 是在运行时填充的,而我需要在编译时定义类。此外,管理 DataTables 听起来也不是最舒服的任务。
所以我终于来问你会做什么。有没有我可以使用的类似于 DataTable 的类型?我是一名物理和数学专业的学生,编程时间不多,所以即使有些东西听起来很基础,我也可能完全错过了。非常感谢任何输入! 提前谢谢你:)
【问题讨论】:
-
我没有一个全面的答案,但想指出,在您上面的示例中,您将(可能)有一个 DiffusionParticle 类,它具有
Movement()方法,并且两者都有Oil和Sorbent继承自。 -- 既然您非常关心维护,您是否有数百种不同的类型和/或它们是否非常动态? (我的意思是人口是多少) -
感谢您的反应。我想要一个大的(50+)和动态的粒子类型列表,这样我就可以快速添加一个新粒子,改变一个粒子的运动方法等等。我不太明白你关于让 Oil 和 Sorbent 粒子从 DiffusionParticle 继承的建议,因为 C# 只允许从一个基类继承,而我希望粒子继承的不仅仅是运动,比如特殊动作。跨度>
标签: c# polymorphism