1

私は最初のサーバー クライアント アプリケーションを作成しているので、あなたの助けが必要です。
クライアントは、いくつかのゲームをプレイできるようになった後、自分自身を認証する必要があります。
したがって、USER クラスと PLAYER クラスがあります。USER は登録されているすべてのユーザーを包括し、PLAYER はゲームをプレイするユーザーを包括します (PLAYER_GAME1、PLAYER_GAME2 などがあります)。
USERの内部には、名前、姓、IDなど
のプロパティがあります.PLAYERの内部には、ユーザーのプロパティとポイント、ゲーム内の時間などが必要です.

実際:

     public class USER
{
        public string name, surname, ID, password, IP;
        WALLET wallet;
        bool login;
        datetime lastAccess;
        TcpClient socket;    
        Thread receiveMessages;//this receive message for log-in
        ...*other 30 proprieties*
     public USER(string n,string s,string _id,string pw)
    {
     *inizialize all variables*
    }
   }

   public class PLAYER
    {
      public USER user;
        Thread receiveMessages;
        int points;
        bool online;
        ...*other proprieties*

     public PLAYER(USER u)
     {
      user=u;
     *inizialize all variables*
     }
    }

名前を取得するには、次のことを行う必要があります。

PLAYER p= new PLAYER(new USER(...));
string name=p.user.name;

私はよりスマートに USER の PLAYER サブクラスを作成すると思います。ユーザーがゲームをプレイしたい場合は、クラスのユーザーをプレーヤーのプロパティで「拡張」する必要があるので、次のようにします。

            public class USER
            {
                protected string name, surname, ID, password, IP;
                WALLET wallet;
                bool login;
                datetime lastAccess;
                TcpClient socket;    
                Thread receiveMessages;//this receive message for meneage the game
                ...*other 30 proprieties*

             public USER(string n,string s,string _id,string pw)
            {
             *inizialize all variables*
            }
           }

           public class PLAYER : USER
            {
                Thread receiveMessages;
                ...*other proprieties*

             public PLAYER():base()// here, what could i do?
             {
             *inizialize all PLAYER variables*
             }
            }

名前を取得するには、次のようにします。

PLAYER p= new PLAYER();
p=exixtingUser;
string name=p.name;

SUBCLASS=MAINCLASS が不可能であることはわかっています。

4

2 に答える 2

1

Player私が理解できるように、情報に基づいて役割を作成したいと考えていUserます。

クラスが次の場合:

public class User
{
    public Guid Id { get; private set; }
    public string Name { get; private set; }

    public User(Guid id, string name)
    {
        Id = id;
        Name = name;
    }
}

public class Player : User
{
    public TimeSpan TimeInGame { get; set; }

    public Player(User userInfo)
        : base(userInfo.Id, userInfo.Name)
    {

    }
}

そのようなコンストラクターの使用法は次のとおりです。

var player = new Player(user);

情報を受け取るコンストラクターを使用できますUser拡張メソッド などを記述することもできます.ToPlayer()

MSDN の継承に関する記事を読んで、引き続きコンストラクターの記事を読んでください。


アップデート:

問題は理解できましたが、残念ながら簡単な解決策はありません。アプリケーションが 1 人のユーザーに基づいて多数のプレーヤーを作成する場合は、現在のソリューションをそのまま使用できます。1 対 1 の関係の場合は、次のようにすることができます。

public class User
{
    public Guid Id { get; private set; }
    public string Name { get; private set; }

    public User(User copyFrom)
    {
        Id = copyFrom.Id;
        Name = copyFrom.Name;
        // copy all the fields you need
    }
}

public class Player : User
{
    public TimeSpan TimeInGame { get; set; }

    public Player(User userInfo)
        : base(userInfo)
    {

    }
}

このソリューションの主な問題は、自動化メカニズムなしで自分でコピーする必要があることです。ここで同様の質問を見つけることができます:

派生クラスから基本クラスの内容をコピーする

于 2014-12-27T15:01:12.233 に答える