Oop 面向对象编程中不同类型模型的特殊服务
对于OOP语言来说,这个问题与语言无关 我有两个类:Oop 面向对象编程中不同类型模型的特殊服务,oop,design-patterns,Oop,Design Patterns,对于OOP语言来说,这个问题与语言无关 我有两个类:DeviceA和DeviceB,它们继承自model类Device。 我需要实现两个服务DeviceService和DeviceBService,它们继承自DeviceService。 我的语言不支持泛型,我需要在设备服务中使用设备参数实现方法,该参数将在设备服务和设备服务中被覆盖,并根据设备的类型以不同方式实现。然后我想从genericDeviceService调用这些函数 设计这个的最佳实践是什么?这里使用if和check on class
DeviceA
和DeviceB
,它们继承自model类Device
。
我需要实现两个服务DeviceService
和DeviceBService
,它们继承自DeviceService
。
我的语言不支持泛型,我需要在设备服务
中使用设备
参数实现方法,该参数将在设备服务
和设备服务
中被覆盖,并根据设备
的类型以不同方式实现。然后我想从genericDeviceService
调用这些函数
设计这个的最佳实践是什么?这里使用
if
和check on class type是不能避免的吗?另一个最佳实现此设计的想法是什么?如果我正确理解了这个问题,那么您有一个抽象基类,如下所示:
public abstract class DeviceService
{
public abstract void DoSomething(Device device);
}
public override void DoSomething(Device device)
{
// Perhaps do something first...
device.Accept(new MyDeviceVisitor());
// Perhaps do something else after...
}
您希望实现deviceservice
和DeviceBService
,以便它们的行为根据设备的类型而有所不同
多态性
最面向对象的设计是使用多态性。因为设备
已经是多态的,所以将您想要区别的行为放入多态方法中,并从您的服务调用它:
public override void DoSomething(Device device)
{
// Perhaps do something first...
device.DoThePolymorphicThing();
// Perhaps do something else after...
}
在DeviceA
和DeviceB
中以不同的方式实现dothepolymorphicing
开放世界
如果您无法更改设备
基类的API,并且您还需要支持除DeviceA
和DeviceB
之外的其他实现,那么您可能需要在DoSomething
中执行运行时签入:
public override void DoSomething(Device device)
{
if (device is DeviceA)
// Do something...
else if (device is DeviceB)
// Do something else...
else
// remember to handle the case where it's neither A nor B
}
我们可以将这种类型的场景称为“开放世界”,因为Device
是为可扩展性而开放的
封闭世界
另一方面,如果您知道只有DeviceA
和DeviceB
,那么设计模式正是您所需要的:
public interface IDeviceVisitor
{
void VisitA(DeviceA device);
void VisitB(DeviceB device);
}
public abstract class Device
{
public abstract void Accept(IDeviceVisitor visitor);
// Other members go here if you need them...
}
public class DeviceA : Device
{
public override void Accept(IDeviceVisitor visitor)
{
visitor.VisitA(this);
}
// Other overrides, if needed, go here...
}
// Define DeviceB in the same way...
您现在可以实现如下服务:
public abstract class DeviceService
{
public abstract void DoSomething(Device device);
}
public override void DoSomething(Device device)
{
// Perhaps do something first...
device.Accept(new MyDeviceVisitor());
// Perhaps do something else after...
}
您可以将此场景视为“封闭世界”场景,因为如果不更改访问者API(从而破坏现有实现),您无法添加第三种类型的设备。这听起来像是过程编程,而不是OOP。数据在一个类中;逻辑是另一种。您必须将数据结构传递到过程中。OOP将两者结合起来,并在同一个类中使用所需的数据实现逻辑。然后逻辑变成多态的。您可以让类DeviceA和DeviceB从设备继承,也可以从mixin服务继承,或者让设备从(或使用)服务继承,如果没有多重继承(可能mixin然后被称为接口)对象也可以包含专门的服务对象。我发现您的方法非常有趣。然而,我宁愿将我的设备类保持为普通模型,而不在其中实现任何业务逻辑方法。我宁愿在服务中实现我的方法。然而,您的输入非常有用,并且是一种可行的方法。