防止方法的大规模阴影

时间:2010-03-04 05:37:34

标签: asp.net vb.net inheritance architecture

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

我的架构是:

基类:OrderForm

儿童课程:PurchaseOrderInvoiceCredit

PurchaseOrder的儿童类:StockingOrder

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

问题

在对我的StockingOrder课程进行编码时,我注意到我必须Shadow使用PurchaseOrder的大多数方法,因为它们从概念上执行相同但需要稍微不同的实现功能。当然,这对我来说很有气味,但我不知道如何修复它。我究竟做错了什么?或者这是正常的吗?(!)

...谢谢

3 个答案:

答案 0 :(得分:3)

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

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
    }
}

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

答案 1 :(得分:1)

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

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

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

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

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

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

Class BaseClass
    Public Overridable Sub MyMethod()
        Trace.WriteLine("The original method")
    End Sub
End Class
Class OverridingClass
    Inherits BaseClass
    Overrides Sub MyMethod()
        Trace.WriteLine("The overriding method")
    End Sub
End Class
Class Tester
    Public Shared Sub TestClasses()
        Dim myObj As Object = New OverridingClass
        Dim var0 As BaseClass = myObj
        var0.MyMethod()
        Dim var1 As OverridingClass = myObj
        var1.MyMethod()
    End Sub
End Class

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

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

答案 2 :(得分:0)

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

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

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

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

http://www.developer.com/lang/other/article.php/939411/Implementing-Interfaces-in-VB-NET.htm

http://blogs.msdn.com/trobbins/archive/2004/08/26/221241.aspx

相关问题