为原子,中子,质子,化学反应创建一个类层次结构

时间:2012-10-04 09:14:37

标签: c# .net visual-c#-express-2010

我需要帮助来创建一个程序,可以显示任何原子及其组件的层次结构(中子,质子,电子和化学反应) 这是我到目前为止所做的一些代码,作为主题的新手

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();
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:4)

警告:请原谅我对亚原子物理学的高中理解,如果我有任何事实上的错误我确定我会很好地解释这个原理

您要模拟的是一系列has a关系。即

  • Atom 零或更多 Nutrons
  • Atom 一个或多个 Electrons
  • Atom 一个或多个 Protons

现在,关系未使用继承建模,正如您尝试的那样,它是由Composition建模的。

public class Atom
{
    private List<Neutron> neutrons;
    private List<Electron> electrons;
    private List<Proton> neutrons;
}

每个类NeutronElectronProton都有一个共同的基类/接口,可以将它们与它们所属的Atom相关联:< / p>

public interface IAtomicComponent
{
    Atom Parent{ get; }
}

这些只是作为想法呈现,因为你的问题有点模糊,但希望能给你一些东西。

化学反应,与takes aAtom的关系。根据{{​​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()
    {
        ...
    }
}