我需要帮助来创建一个程序,可以显示任何原子及其组件的层次结构(中子,质子,电子和化学反应) 这是我到目前为止所做的一些代码,作为主题的新手
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Atoms
{
public class Atoms
{
protected string name = "Sodium";
protected string element ="Metal";
public virtual void GetInfo()
{
Console.WriteLine("name: {0}",name);
Console.WriteLine("element: {0}", element);
}
}
class Proton : Atoms
{
public int number = 11 ;
public override void GetInfo()
{
base.GetInfo();
Console.WriteLine("Proton number: {0}",number);
}
}
class Electron : Atoms
{
public int number = 11;
public override void GetInfo()
{
base.GetInfo();
Console.WriteLine("Electron number: {0}", number);
}
class Neutrons : Atoms
{
public int number = 12;
public override void GetInfo()
{
base.GetInfo();
Console.WriteLine("Neutron number: {0}", number);
}
class TestClass
{
static void Main()
{
Proton P = new Proton();
P.GetInfo();
Neutrons N = new Neutrons();
N.GetInfo();
Electron E = new Electron();
E.GetInfo();
Console.WriteLine("click any key to exit");
Console.ReadLine();
}
}
}
}
}
答案 0 :(得分:4)
警告:请原谅我对亚原子物理学的高中理解,如果我有任何事实上的错误我确定我会很好地解释这个原理
您要模拟的是一系列has a
关系。即
现在,的关系未使用继承建模,正如您尝试的那样,它是由Composition建模的。
public class Atom
{
private List<Neutron> neutrons;
private List<Electron> electrons;
private List<Proton> neutrons;
}
每个类Neutron
,Electron
和Proton
都有一个共同的基类/接口,可以将它们与它们所属的Atom
相关联:< / p>
public interface IAtomicComponent
{
Atom Parent{ get; }
}
这些只是作为想法呈现,因为你的问题有点模糊,但希望能给你一些东西。
化学反应,与takes a
有Atom
的关系。根据{{3}}的基本理解,有一些基本类型,最简单的是综合。这似乎需要2个原子并返回一个新原子。您可以使用界面再次建模:
public interface ISynthesisReaction
{
Atom Synthesise(Atom left, Atom right);
}
然后编写该接口的一个或多个实现。另一个可能是分解,它需要一个Atom并且可以返回多个Atom:
public interface IDecompositionReaction
{
Atom [] Decompose(Atom atom);
}
答案 1 :(得分:1)
你创造了Proton,Neutron和Electon继承自Atom。你在这里说的是基本单位是原子,质子,中子和电子是特殊的原子。事实显然并非如此。质子,中子和电子是基本单位,因为你没有指定任何更小的东西,原子包含许多质子,中子和电子。
因此,我首先创建一个Atom类,它具有描述质子,中子和电子数量的属性。你可以制造质子,中子和电子类,并让原子包含质子,电子和中子阵列,但我不确定这是否有用。当然,你可以将每个质子视为与任何其他质子无法区分,对于中子也是如此,但你可能希望对电子更加聪明。电子可能难以区分,但能量水平并非如此,如果你要进入电离,你可能不想简单地用一个代表电子数的整数,如果你是,你可能想要考虑一个能级结构可以填充或不填充 - 取决于它的用途。
你有一个字符串描述了这是什么类型的元素 - “金属”。如果你要设置一些规则,比如金属可以与非金属反应,你最好定义不同元素类型的枚举。这样你就可以比较整数而不是字符串,这样更有效率,而且输入错误的空间更小,并且最终会出现“反应”代码无法识别的新类型元素。
另外,你似乎已经把你的中子置于电子等级中了。这意味着中子只能作为电子的一部分存在。而你的TestClass又在中子内。您需要考虑不同类之间的逻辑关系,并且在这样的系统中,您不太可能需要在类中定义类 - 将它们作为不同的对象并且具有适当类型的类的字段。所以你的原子类也许可以这样开始:
public class Atom
{
public int number = 11;
public Electron[] electrons;
public Proton[] protons;
public Neutron[] neutrons;
public string name="Sodium";
public ElementTypeEnum elementType;
...
}
答案 2 :(得分:0)
鉴于没有明确的问题,我会假设你想要批评。
仅当实体具有“IS A”关系时才应使用继承。例如。如果你可以说“电子是一个原子”那么你应该考虑从原子继承电子。由于电子不是原子,它表明你的继承是错误的。相反,你会说'原子有电子'; 'HAS A'关系表明聚合,所以也许给出:
class Atom { public Electron {get;set;} ... }
(更准确地说,对于现实世界,我希望原子有一个或多个电子的列表。)
你似乎将原子的类型硬编码到类中(钠)。理想情况下,您将创建一个具有原子类型的持有者的基类,并具有特定原子类型的派生类。 E.g。
public class Atom
{
public string Name {get; protected set;}
public string Type {get; protected set;}
}
public class SodiumAtom : Atom
{
public SodiumAtom()
{
Name = "Sodium";
Type = "Metal";
}
}
这将允许您创建特定类型的原子,但然后像通用原子一样重新设置它:
Atom a = new SodiumAtom();
a.GetInfo();
您的所有课程都有'GetInfo'方法。这是一个“交叉”功能,因为您可能希望很多类具有此功能,无论它们是否具有相同的基类。我建议使用一个界面:
public Interface IDisplayInfo
{
void GetInfo();
}
public class Atom : IDisplayInfo
{
public void GetInfo()
{
...
}
}
public class Electron : IDisplayInfo
{
public void GetInfo()
{
...
}
}