【问题标题】:Override a default property value in an inherited class覆盖继承类中的默认属性值
【发布时间】:2012-12-13 19:20:56
【问题描述】:

假设我定义了以下父类:

Public Class Parent

    Public Property Prop1 As String = "MyDB1"

End Class

我希望继承它,但希望该属性对子类具有不同的值。

我想我可以这样做:

Public Class Child
    Inherits Parent

    Public Sub New()
        MyBase.New()
        MyBase.Prop1 = "MyDB2"
    End Sub

End Class

但我想知道这是否是最好的方法,或者是否有类似 Overridable 属性之类的东西,或者这只是整体上不好的编程习惯?

谢谢!

【问题讨论】:

  • 也许我错过了问题的重点,但是您是否尝试过将属性设为 Overridable?
  • 在子类中重新声明Property怎么样? Public Property Prop1 = "MyDB2"(首先使用 Overridable a la @sellmeadog)
  • 谢谢,@sellmeadog ...我刚刚做到了,它似乎也可以正常工作! - 我想我的问题是那是更好还是更糟,或者只是与我所做的不同?我仍在尝试学习 OOP 的最佳编程实践。谢谢!

标签: .net vb.net oop


【解决方案1】:

在 c# 中,为了让一个属性可以被覆盖,你可以将类成员标记为 virtual,而这个关键字的 vb.net 等价是 Overridable

public virtual int MyProperty {get;set;}

这个属性可以像这样在子类中被覆盖:

 public override int MyProperty {
  get{ 
         //return some other thing
     }
  } 

Vb.NET 等效项:

在超类中:

 Public Overridable Property MyProperty As Integer
        Get

        End Get

        Set

        End Set

    End Property

在子类中:

  Public Overrides Property MyProperty As Integer
        Get
                //return some other thing
        End Get

    End Property

【讨论】:

  • 非常感谢 Behnam,非常有意义,感谢代码示例!!! - 我只是没有将您标记为解决方案(尽管它完全正确),因为@sellmeadog 更快地提供了解决方案。非常感谢,不过!!!
  • @JohnBus​​tos 谢谢!但我比 sellmeadog.anyway 早了 8 分钟... :)
  • 您的解决方案,是的,但我们已经通过 cmets 讨论过......对不起,伙计,我只是想对他公平 :)
【解决方案2】:

根据您的评论,这是我的看法:

  • 如果您可以控制基类,则将其设为 Overridable,如果其意图是根据派生类型的业务规则更改其值
  • 如果您无法控制基类,并且需要“覆盖”该属性,则可以“隐藏”基类属性;在 C# 中,它看起来像 new public int MyProperty { ... } 但我不确定这是如何在 VB 中完成的
  • 如果您只需要让属性返回不同的值,那么您所做的似乎很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2011-01-03
    • 2013-12-04
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多