关于OO设计的问题.
假设我有一个基础对象车辆.还有两个后代:卡车和汽车.
此外,假设基础对象具有基本方法:
Procedure FixFlatTire(); abstract;
Run Code Online (Sandbox Code Playgroud)
当卡车和汽车覆盖基础对象时,它们需要来自呼叫者的不同信息.
我最好在两个后代对象中像这样重载FixFlatTire:
Procedure Truck.FixFlatTire( OfficePhoneNumber: String;
NumberOfAxles: Integer): Override; Overload;
Procedure Automobile.FixFlatTire( WifesPhoneNumber: String;
AAAMembershipID: String): Override; Overload;
Run Code Online (Sandbox Code Playgroud)
或者在每个后代中引入新属性,然后在调用FixFlatTire之前设置它们,如下所示:
Truck.OfficePhoneNumber := '555-555-1212';
Truck.NumberOfAxles := 18;
Truck.FixFlatTire();
Automobile.WifesPhoneNumber := '555-555-2323';
Automobile.AAAMembershipID := 'ABC';
Automobile.FixFlatTire();
Run Code Online (Sandbox Code Playgroud)
如果有问题的数据在逻辑上是后代类的一部分(如果您可以在其他上下文中使用它们),那么将属性直接添加到后代类是有意义的.
如果它们严格适用于FixFlatTire方法,则将它们指定为该函数的参数更有意义.
如果你在后代类中提供不同的方法签名,那就不是(据我所知)一个重载的情况.您只是使用具有不同参数的新函数覆盖原始函数.重载是指两个具有相同名称的功能可用,由不同的签名区分.
[编辑]
再看看你的论点,这里有一些更多的想法:
NumberOfAxles显然似乎是TTruck的财产.
在我看来,PhoneNumber和AAAMembershipID是您尚未拥有的类的属性,TOwner(可能的后代类TCorporateOwner和TIndividualOwner).然后,TOwner引用可以成为TVehicle的属性或FixFlatTire()的参数(尽管我认为它最好属于TVehicle的属性).
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |