我正在创建一个应用程序,只是为了实践c#以及新的编程方法。所以我想到了一个想法,我创建了一个应用程序来存储关于“士兵”前的信息。姓名、军衔、头衔等.但这里的诀窍是,我希望士兵头衔在军衔增加时自动升级。
public class Soldier
{
public string Name { get; private set; }
public int Rank { get; private set; }
public string Title { get; private set; }
public Soldier(string name)
{
Name = name;
RefreshTitle();
}
public void Rankup(int rank = -1)
{
if (-1 != rank)
Rank = rank;
else
Rank++;
RefreshTitle();
}
public void RefreshTitle()
{
Title = SoldierRankLibrary.GetSoldierTitle(Rank);
}
}public class SoldierRankLibrary
{
private static readonly Dictionary<int, string> RankDictionary = new Dictionary<int, string>
{
{0, "Novice"},
{1, "Second Lieutenant"},
{2, "First Lieutenant"},
{3, "Captain"},
{4, "Major"},
{5, "Lieutenant Colonel"},
{6, "Colonel"}
//etc...
};
public static string GetSoldierTitle(int requiredRank)
{
return RankDictionary.FirstOrDefault(rank => rank.Key == requiredRank).Value;
}
}使用代码
static void Main()
{
//Create new soldier...
var soldier = new Soldier("Daniel");
//Print soldier info...
PrintSoldierInfo(soldier);
//Upgrade soldier...
soldier.Rankup();
//Print soldier info...
PrintSoldierInfo(soldier);
Console.Read();
}
static void PrintSoldierInfo(Soldier soldier)
{
Console.WriteLine("****************************************");
Console.WriteLine("Name: {0}", soldier.Name);
Console.Write("Rank: ");
switch (soldier.Rank)
{
case 0:
Console.WriteLine("novice");
break;
case 1:
Console.WriteLine("*");
break;
case 2:
Console.WriteLine("**");
break;
case 3:
Console.WriteLine("***");
break;
case 4:
Console.WriteLine("****");
break;
case 5:
Console.WriteLine("*****");
break;
case 6:
Console.WriteLine("******");
break;
case 7:
Console.WriteLine("*******");
break;
}
Console.WriteLine("Title: {0}", soldier.Title);
Console.WriteLine("****************************************");
Console.WriteLine();
}我真的在等待你的答案,我希望你给我详细的信息,我错过了什么,什么我可以做得更好,我如何改进这个代码。
发布于 2013-07-15 17:55:39
GetSoldierRank()属于Soldier类。这就是Rank { get; set; }的作用。Dictionary将被一个enum取代(见下文)。enum不需要在任何类的内部。可以在枚举上使用布尔运算符("<“、"==”、.)OfficerRank和EnlistedRank枚举。Rank和Title似乎是同一回事。您真的需要通过其基本(整数)值来引用士兵的军衔吗?Rankup() -将名称更改为Promote()。不要传递整数,传递有意义的东西。我们将使用Rank枚举,这样就可以完成账单了。RefreshTitle() -过时了。职级/头衔是一回事。Rank枚举使我们不必处理字符串和int。private Title set和一个public RefreshTitle()是没有意义的。将Property视为一种方法。许多现有的代码只是通过使用公共get属性而消失的。ToString()。现在PrintSoldierInfo()消失了。public enum Rank {undefined, BuckPrivate, Sergeant, Lieutenant, Captain}
public class Soldier {
public string Name { get; protected set; }
public Rank Rank { get; protected set; }
public Soldier (string name) {
Name = name ?? "No Name"; // null coalescing.
Rank = Rank.undefined; // maybe private if enlisted or lieutenant if officer
}
public void Promote (Rank newRank) {
if ((int)this.Rank < (int)newRank ) this.Rank = newRank;
// we don't allow Demotion in this method.
}
public override string ToString() {
Stringbuilder me = new Stringbuilder(); // need to import System.Text to use Stringbuilder
// C# string formatting avoids clumsy string concatination; clearer and less error prone
me.AppendLine("Name: {0} Rank: {1}", Name,Rank);
return me.ToString(); // Stringbuilder must be converted to a string.
}
}使用士兵
Soldier grunt = new Soldier("Sad Sack");
grunt.Promote(Rank.Sergeant);
Console.WriteLine (grunt); // ToString() is automagically called.发布于 2013-07-15 06:30:55
您可以将Rank类型更改为某些enum。
public enum Rank
{
Unknown = -1,
Novice = 0,
SecondLieutenant = 1,
....
}
public static class SoldierRankLibrary
{
private static readonly Dictionary<int, string> RankDictionary = new Dictionary<Rank, string>
{
{Rank.Novice, "Novice"},
....
};
public static string DisplayName(this Rank rank)
{
if (RankDictionary.ContainsKey(rank))
{
return RankDictionary[rank];
}
return rank.ToString();
}
}
public class Soldier
{
public string Name { get; private set; }
public Rank Rank { get; private set; }
public string Title { get { return Rank.DisplayName(); } }
public Soldier(string name, Rank rank = Rank.Unknown)
{
Name = name;
Rank = rank;
}
public void Rankup()
{
Rank++;
}
}https://codereview.stackexchange.com/questions/28471
复制相似问题