我有一个场景,我的基类(Employee
)包含很少的属性,它有两个子类(PermanentEmployee
和ContractEmployee
)。现在只有一个属性是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
答案 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