如何从派生类中隐藏一个属性?

时间:2016-03-17 05:54:12

标签: .net vb.net oop polymorphism

我有一个场景,我的基类(Employee)包含很少的属性,它有两个子类(PermanentEmployeeContractEmployee)。现在只有一个属性是PermanentEmployee(MedicalCoverage)的一部分。我正在使用多态来决定运行时的员工类型,因此我需要将MedicalCoverage属性作为基类的一部分,以便我可以在访问员工对象的客户端代码中访问它。我不想让ContractEmployee拥有这个属性所以如何实现这个或任何替代这个设计。 基类员工看起来像这样

     Public Class Employee
        Public EmployeeId As Integer
        Public EmployeeFirstName As String
        Public EmployeeLastName As String
        Public Salary As Integer
        Public Overridable ReadOnly Property bonus As Double
          Get
             Return Salary
          End Get
       End Property
    End Class

我想让MedicalCoverage成为permanentEmployee的一部分

Public Class PermanantEmployee
    Inherits Employee

    Public Overrides ReadOnly Property bonus As Double
        Get
            Return 15 * Salary
        End Get
    End Property
   Public Property MedicalCoverage As Double 'The property to be accessed only here
End Class

合同员工看起来像这样

    Public Class ContractEmployee : Inherits Employee

        Public Overrides ReadOnly Property bonus As Double
            Get
                Return 12 * Salary
            End Get    
        End Property
       'The MedicalCoverage property is not part of the class here
    End Class

2 个答案:

答案 0 :(得分:1)

简短回答。你不能。这是继承的本质。 如果有什么东西是员工,而员工有一个属性MedicalCoverage,那么从Employee继承的任何类都将具有此属性 但只是一个快速的心灵游戏。如果将ContractEmployee存储在类型为Employee的变量中并尝试访问MedicalCoverage属性,该程序应该怎么做? 如果您坚持这个想法,那么您可以将Employee中的proeprty定义为virtual,并在ContractEmployee中覆盖它,并抛出一个异常,即此实例中不支持此proeprty。
如果您创建了一个接口,您仍然无法通过Employee类型变量访问该属性,并且仍然必须转换为接口类型,因此您可以在PermanantEmployee中添加该属性,如果实例是PermanentEmployee,您可以强制转换为访问它属性。

答案 1 :(得分:0)

这个问题更基于意见。但是,如果我要实现这一点,我将使用“是”运算符来决定是否调用该属性。

if emp is PermanantEmployee then
     (emp as PermananantEmployee).MedicalCoverage = 12.00