Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 重写ToString()_.net_Wpf_Overriding - Fatal编程技术网

.net 重写ToString()

.net 重写ToString(),.net,wpf,overriding,.net,Wpf,Overriding,有没有一种方法可以重写Shape类上的ToString()方法,而不必继承它并在继承的类中执行它?所以,每当我调用任何一个shape'to string方法时,我都会得到一个覆盖的方法 注意:我不想这样: Shpae1:形状 覆盖 我不想这样做的原因是,我的项目中已经有很多形状,椭圆、矩形等(通用的)。我想打印每个形状的位置,我知道我可以将一个形状作为arg的单独函数,但是我已经有一些代码使用形状的to字符串,所以我认为如果我可以更改toString方法,那么我就不必更改任何代码,这会更优雅 N

有没有一种方法可以重写Shape类上的ToString()方法,而不必继承它并在继承的类中执行它?所以,每当我调用任何一个shape'to string方法时,我都会得到一个覆盖的方法

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

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

No;你不能那样做


相反,您可能应该使用DataTemplate。

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

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

扩展现有类(如
Shape
)的主要方法有:

  • 继承。这是不可能的,因为您使用的是密封的
    矩形
    椭圆
  • 部分类。无法工作,因为.NET未将
    形状
    矩形
    等作为分部类提供
  • 扩展方法。将是最优雅的解决方案,但也不起作用,因为只有在类本身不提供方法的情况下才使用扩展方法。而
    ToString()
    是在每个类继承的
    System.Object
    中提供的,因此从技术上讲
    Shape
    Rectangle
    等都有一个
    ToString()
    方法,即使它们本身没有重写它们
  • 所以我会考虑以下两个选项之一:

    • 在实用程序类中创建一个静态方法
      string GetStringInfo(Shape s)
      ,该实用程序类接受
      Shape
      并返回字符串,然后在
      Shape
      上使用
      ToString()
      的任何地方使用此函数
    • 要最小化重构,请在type
      Shape
      上创建扩展方法
      string GetStringInfo()
      ,并重构代码以使用此方法,而不是
      ToString()

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

    似乎OP删除了WPF标签。@Petarepac:事实上,我删除了,因为它与问题无关。你认为我应该把它放回去吗?我认为Slakses的答案在WPF上下文中。@SLaks我明白你对数据模板所说的。@SLaks:Middle:),这个数据模板是WPF的东西?如果是这样,您在WPF上下文中进行了回答,然后删除了WPF标记?您能提供更多详细信息吗?是否要使用Shape.ToString()而不从Shape继承?若有,为什么?OP说这个问题不是WPF特有的。现在怎么办?@petarepac:不;OP没有这么说。@Petar:如果你想知道是谁改变了什么,你只需点击查看修订。实际上Slaks删除了WPF标记并再次添加;)@PetarRepac I添加了上述解释。这与继承Shape并重写ToString()相同。不,它不是。如果从Shape继承,则类将发布Shape拥有的所有公共成员。你不能隐藏它们。如果类中包含Shape实例,则可以选择希望类的客户端可以访问的成员。例如,如果Shape有Draw()方法,则类可以隐藏此方法。这是一个控件。你认为不继承控制权,而是将它们作为私有字段保留是一种好的做法吗?不,我不这么认为。但是我回答了一个问题“有没有一种方法可以在不继承Shape类的情况下重写它的ToString()方法…”。当时WPF标签不存在,我认为问题在于继承。第二个要点似乎是最优雅的解决方案