覆盖ToString()

时间:2011-12-26 20:58:39

标签: .net wpf override

有没有办法覆盖Shape类上的ToString()方法,而不继承它并在继承的类中执行它?所以每当我调用任何形状'到字符串方法时,我都会得到覆盖的那个?

注意我不想这样: Shpae1:形状 覆盖....

我之所以不这样做,是因为我的项目已有很多形状,椭圆形,矩形等(通用的)。我想打印每个形状的位置,我知道我可以将一个形状作为一个arg单独的函数,但我已经有一些代码使用了一个形状的字符串,所以我认为它会更优雅,如果我可以改变toString方法,所以我不必更改任何代码。

3 个答案:

答案 0 :(得分:2)

我不认为这是可能的(也可能有一些涉及动态代码生成的脏反射技巧等。)

扩展像Shape这样的现有类的主要方法是:

  1. 继承即可。这是不可能的,因为您使用了密封的RectangleEllipse等。
  2. 部分课程。不起作用,因为.NET不提供ShapeRectangle等作为部分类。
  3. 扩展方法。将是最优雅的解决方案,但不起作用,因为只有在类不提供方法本身时才使用扩展方法。 ToString()中提供了System.Object,每个类都继承自Shape,因此技术上RectangleToString()等都有string GetStringInfo(Shape s)方法,即使它们没有自己覆盖它们。
  4. 所以我会考虑两个选项之一:

    • 在实用程序类中创建一个静态方法Shape,它接受​​ToString()并返回字符串,然后在Shape上使用string GetStringInfo()的任何地方使用此函数。< / LI>
    • 要最大限度地减少重构,请在Shape类型上创建一个扩展方法ToString()并重构代码以使用此方法代替{{1}}

    如果有人知道另一个有效的解决方案,我也会对此感兴趣。

答案 1 :(得分:0)

没有;你不能这样做。

相反,您应该使用DataTemplate。

答案 2 :(得分:0)

您始终可以将Shape用作类的内部字段,并在ToString()方法中调用_shape.ToString()。