子类应该使用父类的ToString()

时间:2012-10-22 19:21:50

标签: c# oop inheritance

我有一个基类Sport定义为:

public class Sport
{
   public int Id {get; set;}
   public string Name {get; set;}

   public Sport() {}

   public override string ToString()
   {
     string objectState = string.Format("[Id: {0}; Name: {1};]", Id, Name);
     return objectState;
   }
}

我有第二个类继承Sport类:

public class Basketball : Sport
{
   public string PointTerm {get; set;}
   public Basketball() {}      

   //overriding ToString()??
}

如何使用附加属性ToString覆盖基础Sport类中的PointTerm

2 个答案:

答案 0 :(得分:3)

您只需在Basketball课程中添加新的覆盖:

public override string ToString()
{
    return string.Format("[Id: {0}; Name: {1}; PointTerm: {2};]",
                         Id, Name, PointTerm);
}

修改

如果你想与基类的实现保持同步,你可以做这样的事情,但是在大​​多数情况下上面的简单方法可能更好

public override string ToString()
{
    char[] openingBracket = new char[] { '[' };
    char[] closingBracket = new char[] { ']' };     

    string trimmedBaseString = (base.ToString() ?? string.Empty)
                               .TrimStart(openingBracket).TrimEnd(closingBracket);
    return string.Format("[{0} PointTerm: {1};]", trimmedBaseString, PointTerm);
}

答案 1 :(得分:0)

我不确定这是否适用于您的情况(或任何情况),但当然可以找到您的类型上定义的所有属性(无论是{{ 1}},Sport或其他衍生类型)使用反射

也许如果你在Basketball课程中这样写:

Sport

然后public sealed override string ToString() { var allStrings = GetType().GetProperties() .Select(p => p.Name + ": " + p.GetValue(this, null)); return "[" + string.Join("; ", allStrings) + ";]"; } 以及从中派生的所有类型都会以相同的方式定义Sport,并且它将使用反射来查找所有(公共)属性。