-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関係です。すなわち

  • Atom には0 個以上のニュートロンがあります
  • 原子 には1 つ以上の電子があります
  • Atom には1 つ以上の陽子があります

さて、has a Relationship は、あなたが試みたように Inheritance を使用してモデル化されるのではなく、Composition によってモデル化されます。

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

各クラスは、それらが属するクラスに関連付ける共通の基本クラス/インターフェースを持っている可能性NeutronがありますElectronProtonAtom

public interface IAtomicComponent
{
    Atom Parent{ get; }
}

あなたの質問は少し漠然としているので、これらは単なるアイデアとして提示されていますが、うまくいけば何かを続けることができます.

化学反応は、takes aと関係がありAtomます。化学反応に関するウィキペディアの記事を読むことによる私の基本的な理解から、いくつかの基本的なタイプがあり、最も単純なものは合成です。これは 2 つの Atom を取り、1 つの新しい Atom を返すように見えます。これは、インターフェイスを使用して再度モデル化できます。

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

そして、そのインターフェースの 1 つ以上の実装を作成します。もう 1 つは、1 つの Atom を取り、複数の Atom を返すことができる分解です。

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

Atom から継承して Proton、Neutron、Electon を作成しました。ここであなたが言っているのは、基本単位は原子であり、陽子、中性子、電子は特別な種類の原子であるということです. これは明らかにそうではありません。陽子、中性子、および電子が基本単位です。これより小さな単位は指定しないためです。原子には多数の陽子、中性子、および電子が含まれます。

したがって、陽子、中性子、および電子の数を表すプロパティを持つ Atom クラスを作成することから始めます。陽子、中性子、および電子のクラスを作成し、原子に陽子、電子、および中性子の配列を含めることができますが、これが役立つかどうかはわかりません。確かに、各陽子を他の陽子と区別がつかないものとして扱うことができ、中性子についても同様ですが、電子をもっと賢く扱いたいと思うかもしれません. 電子は区別できないかもしれませんが、エネルギー準位はそうではありません。イオン化を行う場合は、単に電子数を表す整数を持ちたくない場合があります。そうであれば、エネルギー準位の構造を検討する必要があります。移入できるかどうかは、これが何のためにあるかによって異なります。

これがどのような種類の要素であるかを説明する文字列があります-「金属」。金属が非金属と反応できるなど、いくつかのルールを設定する場合は、さまざまな要素タイプの列挙を定義することをお勧めします。このように、文字列ではなく整数を比較しているため、より効率的であり、何か間違ったことを入力して、「反応」コードによって認識されない新しいタイプの要素になる可能性が少なくなります。

また、中性子を電子クラス内に作成したようです。これは、中性子が電子の一部としてしか存在できないことを意味します。そして、TestClass は再び neutron 内にあります。異なるクラス間の論理関係について考える必要があります。このようなシステムでは、クラス内でクラスを定義する必要はほとんどありません。クラスを個別のオブジェクトとして持ち、適切なタイプのクラスのフィールドを持ちます。したがって、アトムクラスは、おそらく次のように開始できます。

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 に答える