-3

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

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

3 回答 3

4

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

您要建模的是一系列 has a关系。IE

  • 一个原子 有零个或多个Nutron
  • 一个原子 一个或多个电子
  • 一个原子 一个或多个质子

现在,没有像您尝试做的那样使用继承建模,而是通过组合建模。

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

很可能每个类Neutron都有Electron一个Proton共同的基类/接口,将它们与Atom它们所属的相关联:

public interface IAtomicComponent
{
    Atom Parent{ get; }
}

这些只是作为想法提出,因为你的问题有点含糊,但希望能给你一些继续下去的机会。

化学反应,有takes a关系Atom根据我通过阅读关于化学反应的维基百科文章的基本理解,有几种基本类型,最简单的是合成。这似乎需要 2 个原子并返回一个新原子。您可以使用接口再次建模:

public interface ISynthesisReaction
{
   Atom Synthesise(Atom left, Atom right);
}

然后您编写该接口的一个或多个实现。另一个可能是分解,它采用单个 Atom 并可以返回多个:

public interface IDecompositionReaction
{
   Atom [] Decompose(Atom atom);
}
于 2012-10-04T09:35:44.727 回答
1

您已经创建了继承自 Atom 的 Proton、Neutron 和 Electon。你在这里说的是基本单位是原子,质子、中子和电子是特殊的原子。这显然不是这样的。质子、中子和电子是基本单位,因为您没有指定任何更小的单位,并且一个原子包含许多质子、中子和电子。

因此,我将首先创建一个 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;

    ...
}
于 2012-10-04T09:34:41.627 回答
0

鉴于没有明确的问题,我假设您想要批评。

仅当实体具有“IS A”关系时才应使用继承。例如,如果您可以声明“电子是原子”,那么您应该考虑从原子继承电子。由于电子不是原子,因此表明您的继承是错误的。相反,您会说“一个原子有一个电子”;'HAS A' 关系表明聚合,因此可能给出:

    类原子
    {
        公共电子 {get;set;}

        ...
    }

(更准确地说,对于现实世界,我希望一个原子有一个包含 1 个或多个电子的列表。)

您似乎将原子的类型硬编码到类(钠)中。理想情况下,您将创建一个基类,其中包含原子类型的持有者,并具有特定原子类型的派生类。例如


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()
    {
        ...
    }
}


于 2012-10-04T09:40:38.387 回答