Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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
C# 除了一个方法之外,如何重构两个做相同事情的类,使它们更易于面向对象?_C#_Oop_Abstraction_Solid Principles - Fatal编程技术网

C# 除了一个方法之外,如何重构两个做相同事情的类,使它们更易于面向对象?

C# 除了一个方法之外,如何重构两个做相同事情的类,使它们更易于面向对象?,c#,oop,abstraction,solid-principles,C#,Oop,Abstraction,Solid Principles,我在设计项目的一个模块时遇到了问题 比如说,你有两个班,他们两个几乎都在做同样的事情。你可以像DeviceManager那样思考 两者的连接/断开连接/解析方式完全相同。在解析来自设备的消息之后,他们需要做不同的事情,比如其中一个打印消息,另一个将消息传递到其他地方 我需要在oop允许的情况下最好地设计这个结构,可能是继承、接口、抽象等。但我不确定解决这个问题的最佳方法是什么 注:我不想违反任何坚实的原则 谢谢 例如: // lines exactly same code ** line dif

我在设计项目的一个模块时遇到了问题

比如说,你有两个班,他们两个几乎都在做同样的事情。你可以像DeviceManager那样思考

两者的连接/断开连接/解析方式完全相同。在解析来自设备的消息之后,他们需要做不同的事情,比如其中一个打印消息,另一个将消息传递到其他地方

我需要在oop允许的情况下最好地设计这个结构,可能是继承、接口、抽象等。但我不确定解决这个问题的最佳方法是什么

注:我不想违反任何坚实的原则

谢谢

例如:

// lines exactly same code
** line different code

class DeviceMessageNavigator
{
    //connect 
    //wait message
    //parse message
    **//NAVIGATE MESSAGE(Pass it to somewhere else)**
    //disconnect
}
class DeviceMessagePrinter
{
    //connect
    //wait message
    //parse message
    **//PRINT MESSAGE**
    //disconnect
}

根据Olivier的回答我起草了这个,我不确定这是最好的方法

abstract class DeviceMessage
{
    protected string message;
    //connect
    //wait message
    //parse message
    message=recievedMessage;
    abstract void ProcessMessage();
    //disconnect
}
class DeviceMessageNavigator:DeviceMessage
{
    //connect 
    //wait message
    //parse message
    **//NAVIGATE MESSAGE(Pass it to somewhere else)**
    //disconnect
}
class DeviceMessagePrinter:DeviceMessage
{
    //connect
    //wait message
    //parse message
    **//PRINT MESSAGE**
    //disconnect
}

你自己的答案很像伪代码,但方向正确。 请张贴完整的代码,以便复制/粘贴和编辑。因此,帮助你更容易

public abstract class DeviceMessageBase
{
    public void Connect()
    {
        // do connect things
    }

    public void WaitMessage()
    {
        // do wait message things
    }

    public void ParseMessage()
    {
        // do parse message things
    }

    public abstract void ProcessMessage();

}

public class DeviceMessageNavigator : DeviceMessageBase
{
    public override void ProcessMessage()
    {
        //**//NAVIGATE MESSAGE(Pass it to somewhere else)**
    }
}

public class DeviceMessagePrinter : DeviceMessageBase
{
    public override void ProcessMessage()
    {
        //**//PRINT MESSAGE**
    }
}

实际上,您有两个选择:

  • 您可以创建一个抽象类,其中包含两个类之间的共同点,然后通过添加所需的方法对其进行扩展
  • 您可以编写第一个,然后将其扩展到第二个,添加所需内容
  • 您可以编写一个带有print方法和navigate方法的DeviceManager类(如果它们除了一个方法外还做同样的事情,这可能就是您的答案)
我认为您对OOP的看法可能不太正确,您可能需要更详细地了解它。例如,在我看来,这些类更像函数:您在其中注释的每个指令都应该是自己的方法。请参见类似于实际对象蓝图的类:您可以构建对象并将其用作预期蓝图,或者将其更改为具有不同属性和功能的不同对象。
让我们来看看汽车的蓝图,它有一些特性,比如汽车的形状、车门的数量等等。当你和它互动时,它有一些功能,比如打开它,改变收音机的音量,加速等等。。。在这个例子中,你的问题是:我需要两张完全相同的丰田雅力士(toyota yaris)蓝图,一张有内置咖啡机,另一张有wifi,我如何设计它们?答案是:拿一个丰田雅丽的蓝图,复制一份,然后在其中一个中添加咖啡机,在另一个中添加wifi路由器。

您可以创建一个(抽象)根类来重构公共代码和数据。| | | | |咖啡机也可以是一个集合或组合,作为一个选项列表|