【问题标题】:Aliasing property names in derived class?派生类中的别名属性名称?
【发布时间】:2012-04-23 03:25:33
【问题描述】:

我正在通过继承我自己的 Point 类来编写自己的 Vector 类。我在 Point 类中称为 x、y 和 z 的字段我想在 Vector 类中称为 i、j 和 k。相同的私有双变量支持属性。

我使用的方法是在 Vector 类中将 x、y 和 z 声明为私有,并将 i、j 和 k 设置为公共,但使用相同的 get/setter,如下所示:

这行得通吗,还是我让自己心痛?

public class ptsVector : ptsPoint
{
   private double x { get { return x_; } set { x_ = value; } }
   private double y { get { return y_; } set { y_ = value; } }
   private double z { get { return z_; } set { z_ = value; } }

   public double i { get { return x_; } set { x_ = value; } }
   public double j { get { return y_; } set { y_ = value; } }
   public double k { get { return z_; } set { z_ = value; } }
   // methods elided for clarity
}

请注意,Point 类将 x_、y_ 和 z_ 作为受保护的双精度对象。

【问题讨论】:

  • 在技术上可以正常工作,但有点令人困惑。如果我正在开发和使用这个类,我会因为有 2 个属性设置器设置相同的变量而感到沮丧。
  • 是否有另一种(首选)方式为属性名称取别名?
  • 你为什么要重新发明轮子?
  • 个人而言,如果您想要同一事物的 2 个名称,请将它们都设为 getter 并创建一个方法来设置与任一名称不紧密耦合的值,即创建一个 DefineVector(x,y,z)什么的。
  • @lukas:我不确定你在说什么。 msdn.microsoft.com/en-us/library/system.windows.vector.aspx 是一个二维向量。我需要一个 3d 矢量。

标签: c# design-patterns inheritance properties polymorphism


【解决方案1】:

我认为我们需要更多关于您将如何使用这些的信息。如果您不需要将 ptsVector 称为 ptsPoint,那么我会放弃继承。你能说一个向量是一个点吗?如果不是,那么这里就不适合多态了。

抛开这个特殊的例子不谈,我认为对属性进行别名是一个坏主意,无论如何。它增加了很多复杂性而没有真正的好处。

【讨论】:

  • 你能说向量是一个点吗?在某些方面,是的,在其他方面,不是。它只有三个组件,就像一个点。但是你不能点积和叉积点,只有向量。如果你从另一个点中减去一个点,你会得到一个向量。所以,就像我说的,从软件开发的角度来看,定义它的界限是模糊的。但是关于向量的文献指的是 i、j 和 k,所以我想保持一致。
  • 我说打破关系,单独开发类。如果将来您发现很多重复的功能,那么您可以尝试将通用代码放入通用基类中。
  • 我同意,vector != point 即使它们具有相同的属性
  • 已采纳建议——删除继承关系。我想我第一次心痛是当我试图把它放在我的点课中时:public ptsVector subtract(ptsPoint otherPt){...}
【解决方案2】:

我会避免这样做:仅从语义的角度来看,它们是两个不同的概念,一个并不真正“继承”另一个。如果有的话,我会说一个向量 包含两个,因为它被定义为从A点到B点的路径。

正如您所说,当您开始向类添加功能时,您会感到心痛。您认为从这种继承中获得的任何好处最好以语义正确的方式进行。

【讨论】:

  • 我认为从技术上讲,向量被定义为 dx, dy, dz (在这种情况下),提供两个点是一条路径,向量与原点无关,即向量将始终是 (0,0,0) 和 (x,y,z) 之间的路径
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多