C# 除了一个方法之外,如何重构两个做相同事情的类,使它们更易于面向对象?
我在设计项目的一个模块时遇到了问题 比如说,你有两个班,他们两个几乎都在做同样的事情。你可以像DeviceManager那样思考 两者的连接/断开连接/解析方式完全相同。在解析来自设备的消息之后,他们需要做不同的事情,比如其中一个打印消息,另一个将消息传递到其他地方 我需要在oop允许的情况下最好地设计这个结构,可能是继承、接口、抽象等。但我不确定解决这个问题的最佳方法是什么 注:我不想违反任何坚实的原则 谢谢 例如:C# 除了一个方法之外,如何重构两个做相同事情的类,使它们更易于面向对象?,c#,oop,abstraction,solid-principles,C#,Oop,Abstraction,Solid Principles,我在设计项目的一个模块时遇到了问题 比如说,你有两个班,他们两个几乎都在做同样的事情。你可以像DeviceManager那样思考 两者的连接/断开连接/解析方式完全相同。在解析来自设备的消息之后,他们需要做不同的事情,比如其中一个打印消息,另一个将消息传递到其他地方 我需要在oop允许的情况下最好地设计这个结构,可能是继承、接口、抽象等。但我不确定解决这个问题的最佳方法是什么 注:我不想违反任何坚实的原则 谢谢 例如: // lines exactly same code ** line dif
// 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类(如果它们除了一个方法外还做同样的事情,这可能就是您的答案)
让我们来看看汽车的蓝图,它有一些特性,比如汽车的形状、车门的数量等等。当你和它互动时,它有一些功能,比如打开它,改变收音机的音量,加速等等。。。在这个例子中,你的问题是:我需要两张完全相同的丰田雅力士(toyota yaris)蓝图,一张有内置咖啡机,另一张有wifi,我如何设计它们?答案是:拿一个丰田雅丽的蓝图,复制一份,然后在其中一个中添加咖啡机,在另一个中添加wifi路由器。您可以创建一个(抽象)根类来重构公共代码和数据。| | | | |咖啡机也可以是一个集合或组合,作为一个选项列表|