【问题标题】:How can I supress a property or method from a base-class in a derived class in VB.NET?如何抑制 VB.NET 派生类中基类的属性或方法?
【发布时间】:2011-04-07 13:17:20
【问题描述】:

假设一个基类

Public Class airplane

Private var_num_seats As Integer
Private var_num_engines As Integer

Protected Property num_seats As Integer
    Get
        Return var_num_seats
    End Get
    Set(ByVal param_num_seats As Integer)
        var_num_seats = param_num_seats
    End Set
End Property

Protected Friend Property num_engines As Integer
    Get
        Return var_num_engines

    End Get
    Set(ByVal param_num_engines As Integer)
        var_num_engines = param_num_engines
    End Set
End Property

Protected Friend Sub take_off()
    'Do take off tasks
End Sub

Protected Friend Sub start_engines()
    'start each engine
End Sub

End Class

还有一个子类

Public Class glider
Inherits airplane

Private var_towed As Boolean
Private var_glide_rate As Double

Public ReadOnly Property towed As Boolean
    Get
        Return var_towed
    End Get
End Property

Public ReadOnly Property glide_rate As Double
    Get
        Return var_glide_rate
    End Get
End Property

Public Sub to_glide()
    'do gliding
End Sub

End Class

显然,我不希望 Glider 类具有方法“start_engines”和属性“num_engines”。否则,其他子类可能有。如何在子类中抑制这些属性和方法,而不仅仅是忽略(如果可以的话)?

谢谢!

【问题讨论】:

    标签: .net vb.net oop


    【解决方案1】:

    你不能!

    原因:破坏了面向对象!!!!

    假设你有:

    public void ThisIsAMethod(Airplane plane)
    {
        plane.start_engines();
    }
    

    现在你可以这样使用它:

    Airplane aPlane = new Glider();
    ThisIsAMethod(aPlane);
    

    哦不,aPlane 真的是滑翔机,因此你不应该调用它。但是,它是一架飞机,因此有方法。

    解决办法:

    1. 形成真正的继承。滑翔机不是飞机。也许您可以为“FlyingMachine”或“WingedFlier”或它们都扩展的东西创建一个基类。
    2. 黑客模式!在滑翔机中:

      受保护的朋友子 start_engines() 抛出新的 NotSupportedException() 结束子

    【讨论】:

    • 多个感叹号肯定是有病的迹象。
    • 我只是在回答时非常兴奋;)
    • +0.49。任何飞机都应该能够start_engines() 而不必担心不支持该操作,因为它是界面的一部分。 (但请注意,start_engines() 不一定要任何事情,除了大概让飞机准备好移动。没有引擎启动的滑翔机,它可以返回。)同样地, num_engines 总是可以返回 0。(它应该真的是只读的或“私有集”!飞机不应该能够改变它们的引擎数量。)但是是的,如果滑翔机的使用方式与飞机不同,一个不应该从另一个继承。
    • 是的,我认为有一个关于类的概念设计的问题。我只是想知道这是否可能。
    【解决方案2】:

    我怀疑您正在寻找使用界面。

    http://msdn.microsoft.com/en-us/library/h9xt0sdd.aspx

    【讨论】:

    • 有趣...在界面中我不应该声明 start_engines 和 num_engines 并且这样可以避免操作?
    • 我已经有一段时间没有想到我的任何 VB 代码了,将不得不回复你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2010-11-11
    相关资源
    最近更新 更多