【问题标题】:How can I use a different ToString method in a derived class?如何在派生类中使用不同的 ToString 方法?
【发布时间】:2014-04-21 12:40:04
【问题描述】:

我有一个汽车列表,我使用重写的 ToString 方法在列表框中显示该列表。 我已经为汽车模型(例如掀背车)派生了类,我需要在不丢失基本 tostring 方法的情况下显示有关派生汽车模型的更多信息。

如何在一个列表框中显示 CARS 列表,在另一个列表框中显示“掀背车”详细信息。

如果我覆盖 Models 类中的 ToString,它也会覆盖我试图为 CARS 显示的详细信息。

谢谢 对不起,C# 我的汽车方法是

public override string ToString()
    {
        return Name + " [" + this.GetType().Name.ToString() + "] called " + Type;
    }

但是,当我创建派生类时,有时我想使用派生类中的 ToString,而不总是使用基类中的 ToString。

【问题讨论】:

  • 你能用相应的语言标记它并发布你尝试过的代码吗?
  • “有时”什么时候?在什么条件下?
  • 能不能不直接在派生类中调用base.ToString,把逻辑放到派生的实现代码中?

标签: c# tostring


【解决方案1】:

简短的回答是您无法按照您的描述进行操作。一旦在派生类中重写了虚方法,就无法从派生类访问基类中的版本。

我会考虑向派生类添加一个新方法或属性,以检索掀背车的特定信息。

class Car
{
    public override string ToString()
    {
        return "some basic info"; // Whatever you want
    }
}

class Hatchback : Car
{
     public string HatchbackInfo
     {
         get{return "some hatchback info";}  // Return some details only hatchbacks have
     }
}

当使用实际上可能是掀背车的 Car 对象集合时,您可以检查对象的类型并采取相应措施:

public void DoSomeStuffWithCars(List<Car> cars)
{
      foreach(Car c in cars)
      {
          Hatchback h = c as Hatchback.
          if(h != null)  // alternatively you can use the 'is' operator
          {
               // do some hatchback stuff with h.HatchbackInfo
          } 
          // logic here applies to all cars
      }
}

【讨论】:

  • -1 根据对象的派生类型而变化的行为应该在虚拟方法中。
  • @ClickRick:OP 没有要求根据派生类型而变化的行为。他们要求一种方法来专门将信息与派生类型相关联。
猜你喜欢
  • 1970-01-01
  • 2019-09-13
  • 2015-01-17
  • 2021-07-18
  • 2013-11-19
  • 2014-09-04
  • 2019-03-17
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多