Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象编程中不同类型模型的特殊服务_Oop_Design Patterns - Fatal编程技术网

Oop 面向对象编程中不同类型模型的特殊服务

Oop 面向对象编程中不同类型模型的特殊服务,oop,design-patterns,Oop,Design Patterns,对于OOP语言来说,这个问题与语言无关 我有两个类:DeviceA和DeviceB,它们继承自model类Device。 我需要实现两个服务DeviceService和DeviceBService,它们继承自DeviceService。 我的语言不支持泛型,我需要在设备服务中使用设备参数实现方法,该参数将在设备服务和设备服务中被覆盖,并根据设备的类型以不同方式实现。然后我想从genericDeviceService调用这些函数 设计这个的最佳实践是什么?这里使用if和check on class

对于OOP语言来说,这个问题与语言无关

我有两个类:
DeviceA
DeviceB
,它们继承自model类
Device
。 我需要实现两个服务
DeviceService
DeviceBService
,它们继承自
DeviceService
。 我的语言不支持泛型,我需要在
设备服务
中使用
设备
参数实现方法,该参数将在
设备服务
设备服务
中被覆盖,并根据
设备
的类型以不同方式实现。然后我想从generic
DeviceService
调用这些函数


设计这个的最佳实践是什么?这里使用
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然后被称为接口)对象也可以包含专门的服务对象。我发现您的方法非常有趣。然而,我宁愿将我的设备类保持为普通模型,而不在其中实现任何业务逻辑方法。我宁愿在服务中实现我的方法。然而,您的输入非常有用,并且是一种可行的方法。