转换继承的对象

时间:2013-11-25 10:33:16

标签: .net vb.net inheritance

假设我有3个非常简单的对象,AutomobileCarCoach(为了简单起见)。

汽车有财产:

Id / EngineSize / WheelCount / TopSpeed

Car继承自Automobile并具有其他属性

NumberOfDoors / NumberOfSeats

Coach继承自汽车并具有其他属性

NumberOfPassengers / MaxLuggageWeight

现在假设我通过Id得到了我的对象,并创建了一个基本的帮助方法,就像这样得到我的对象

HelperMethod.GetTransport(pId AS Integer) AS OBJECT

现在此方法将返回Car或Coach对象。

如果我想在此对象上设置一个属性,这个属性在Automobile类中,我是否只是将返回的对象转换为Automobile对象,如此

Dim lMyObject AS Automobile = HelperMethod.GetTransport(1)
lMyObject.EngineSize = 1000

或者我应该创建一个IAutomobile接口,基础汽车类将实现该接口,并将返回的对象强制转换为如此:

Dim lMyObject AS IAutomobile = HelperMethod.GetTransport(1)
lMyObject.EngineSize = 1000

如果有最佳实践方法吗?这些都是正确的吗?它只适用于程序员?出于某种原因,我认为接口听起来是正确的,但我不是百分百肯定。

为了扩大这一点的原因。这样做的原因是因为我有一个Web应用程序,用户可以在其中配置这些对象属性。一些网页用于两个对象,因为页面仅包含“基础”类汽车中的字段。在这些页面上,我只想知道如何构建对象以便在基类中设置属性。我应该做

Dim lTransport AS Automobile = HelperMethod.getTransport(1)
lTransport.EngineSize = 1000

OR

Dim lTransport AS IAutomobile = HelperMethod.getTransport(1)
lTransport.EngineSize = 1000

1 个答案:

答案 0 :(得分:3)

什么是IAutomobile - 你没有提到有接口和抽象基类。

无论如何,在您的示例中,EngineSize是基类的成员,因此您应该能够在Automobile变量上正确分配它,而无需任何显式强制转换。但是,如果您想设置某些特定字段,例如NumberOfDoors,那么您有许多选项。首先,您有选项1:只需将GetAutomobile的结果转换为Car。但说实话,我通常会认为需要知道派生类型是设计中的一个缺陷并试图完全避免它 - 毕竟如果你需要特定的属性,为什么你会尝试使用Automobile取决于汽车的类型?在这种情况下,最好有一个单独的方法Helper.GetCarHelper.GetCoach来包装检查,并保证返回正确的对象类型,因此您也可以将其直接分配给{{1 }}