何时设定常数值?在课堂内或初始化期间?

时间:2014-04-05 10:35:07

标签: .net

我是OOP的新手并且有一个施工问题。

我有一个名为Person的类,包含子类(StrongPerson,CrazyPerson等)。 Person类有许多属性,其中之一是Property Strength。

Public Class Person
private m_Strength as integer
Protected Property Strength() as Integer
End Class

Public Class StrongPerson
Inherits Person
...

End Class

每个子类都有自己的Strengthvalue。例如。 StrongPerson的值为10.我看到了编码的两种可能性。要么我在子类中设置10(但我不知道如何做到这一点)或者我在初始化期间设置了10。编码的常见或首选方式是什么?

2 个答案:

答案 0 :(得分:0)

由于Property Strength()是子类必须为其提供值的超类的属性,因此您至少有两种有效的方法来实现它:

  • 制作受保护的构造函数,其值为strength,并将其存储在m_Strength
  • 使属性的getter为abstract,并删除m_Strength成员。这将强制Person类是抽象的。所有子类都需要为Strength属性提供自己的getter实现,并返回自己的常量。

您还可以使m_Strength受保护,并将其设置在子类的构造函数中。这个选择非常脆弱,因为实现子类的程序员可能忘记设置强度,编译器无法帮助他们发现这个问题。此方法应限于m_Strength具有适用于大多数时间的非常好的默认值的情况。

答案 1 :(得分:0)

如果类本身决定其属性值是什么,那么它不应该有setter。您可以使用虚拟计算属性,然后可以在子类中覆盖它。

class Person
{
    protected virtual int Strength //can be abstract 
    {
        get { return 0; }
    }
}

class StrongPerson : Person
{
    protected override int Strength
    {
        get { return 10; }
    }
}

class WeakPerson : Person
{
    protected override int Strength
    {
        get { return 2; }
    }
}

对于VB.Net版本,您可以使用此online converter