【问题标题】:problems with extended classes and overwrite with methods扩展类和方法覆盖的问题
【发布时间】:2011-03-01 15:21:01
【问题描述】:

我有一个用 C# 编写的 .net 网站,并将提供其他开发人员可以使用的功能。 所以我会做一些默认的实现,开发者可以覆盖一些方法

示例: 我有一个类ShoppingCart 和一个类Product 类产品有一个方法getProductPrice 购物车会调用方法getProductPrice计算购物车的总价

ShoppingCartProduct 在同一个项目中,我会将 .dll 提供给开发人员,以便他们无法更改源代码,以便我们稍后更新程序集

所以他们需要创建另一个项目并扩展产品类并覆盖方法getProductPrice,以便他们可以实现自己的逻辑 问题是购物车不会调用扩展方法而是调用原来的方法

如果我们已经为开发人员创建了一个扩展项目,并且购物车将调用扩展方法,那么我们就有一个循环引用 因为扩展产品需要引用产品和购物车到扩展产品

部分类也不起作用,因为我们只能在同一个程序集中使用部分类

有人有什么建议吗?

提前致谢。

【问题讨论】:

  • 术语是“覆盖”,而不是“覆盖”
  • 任何答案有帮助吗?您需要进一步的帮助吗?

标签: c# .net partial-classes overwrite


【解决方案1】:

您应该将所有Product 方法标记为virtual

public virtual decimal GetProductPrice() { };

那么后面接手的开发者就可以继承产品,重写方法:

public class OverriddenProduct : Product
{
   public override decimal GetProductPrice() { }
}

因为OverridenProduct(在我上面的示例中)继承自Product,它仍然可以添加到ShoppingCart 类中的Product 集合中。

我猜只是语义,但 ShoppingCart 类的方法可能应该是 GetTotalPrice() 而不是 GetProductPrice(),因为我假设您正在获取购物车中产品的总成本。

【讨论】:

  • 试图实现它,改变一些逻辑和类,但我认为这是一个解决方案
【解决方案2】:

将您的方法声明为虚拟方法。这允许您在继承类中覆盖它,以便对它的任何调用都将始终路由到覆盖实现。 More about virtual methods.

另外,GetProductPrice 听起来可能更适合作为属性而不是方法来实现。

【讨论】: