防止方法的大规模阴影[关闭]

问题描述 投票:2回答:3

我正处于一个项目中,这是我第一次自己做所有的架构,而且我遇到了令人沮丧的情况。从启发式的角度来看,我的表单架构似乎是正确的,但我不认为它的实现是正确的。

因此我的架构是:

基类:OrderForm

儿童班:qazxsw poi,qazxsw poi,qazxsw poi

儿童类PurchaseOrderInvoice

在架构上这对我来说是有意义的,因为所有子类都是OrderForms(“是a”),而Stocking Order“是一个”购买订单,只是一种特殊的类型。

问题

在编写我的Credit类时,我注意到我必须使用PurchaseOrder,如果不是所有我想在StockingOrder中使用的方法,因为它们在概念上做同样的事情但需要稍微不同的实现功能。当然,这对我来说很有气味,但我不知道如何修复它。我究竟做错了什么?或者这是正常的吗?(!)

谢谢...

asp.net vb.net inheritance architecture
3个回答
3
投票

听起来你可能需要在PurchaseOrder中使用一些虚拟方法。可能类似于以下内容:

StockingOrder

这应该有助于重用更多代码,因为您可以将您在PurchaseOrder DoSomethingMethod中编写的类似逻辑分组,同时保留虚拟DoSomethingElse方法中的专用逻辑(在PurchaseOrder和StockingOrder之间不同)。


1
投票

正如mdearing06建议的那样,你应该使用虚方法(或者只是可覆盖的方法)并覆盖它们。使用Shadowing更改自己代码的功能有点不好。阴影意味着在不常见的场景中使用,即:当您从其他人编写的类继承并且您必须更改其某些功能,但无法查看/编辑代码本身时。

考虑一下Shadowing与Overloading非常相似的事实(只是它隐藏了基本实现),并且与Overriding完全不同。只有在通过类明确引用对象时,才会调用阴影方法;否则,将调用原始方法(与Overriding不同,其中基于内容而不是在引用对象的表示上调用方法)。

以下是表示如何影响阴影方法调用的示例:

Shadow

运行Tester.TestClasses后,跟踪将显示:“原始方法”,后跟“阴影方法”。

现在,如果我们使用以下代码:

PurchaseOrder

跟踪输出将显示“覆盖方法”,然后显示“覆盖方法”。

总而言之,我会说压倒一切是“正常”的方式,阴影是一种异常现象。


0
投票

另一种选择是使用接口;设置代码合同,允许您编程定义一个定义的接口,而不必担心下面的impmentation。

这也允许您定义多个专注于特定任务的接口,这使您的代码更易于维护和灵活。

然后,对于常见方法,将它们放在您的实现可以利用的辅助类中。

查看这些以获取更多参考:)

public abstract class OrderForm { //orderform members } public class PurchaseOrder: OrderForm { public void DoSomething() { //some logic that can be reused by child classes DoSomethingElse(); } protected virtual void DoSomethingElse() { //specialized logic } } public class StockingOrder: PurchaseOrder { protected override void DoSomethingElse() { //specialized logic that makes StockingOrder different than PurchaseOrder } }

Class BaseClass Public Sub MyMethod() Trace.WriteLine("The original method") End Sub End Class Class ShadowClass Inherits BaseClass Shadows Sub MyMethod() Trace.WriteLine("The shadowing method") End Sub End Class Class Tester Public Shared Sub TestClasses() Dim myObj As Object = New ShadowClass Dim var0 As BaseClass = myObj var0.MyMethod() Dim var1 As ShadowClass = myObj var1.MyMethod() End Sub End Class

© www.soinside.com 2019 - 2024. All rights reserved.