接口、抽象类中涉及委托,如何设计和实现?
代码要做重构,需重新设计。
###原代码实现如下,类A中存在调用其他2个类的委托:
class A
{
private clsTCP myTCP=null; //clsTCP:另外定义的类。
private clsUDP myUDP=null; //clsUDP:另外定义的类。
void SampleMethod()
{
if () //条件省略
{
myTCP = new clsTCP(sIp, iPort);
myTCP.ShowConnState = new clsTCP.dgShowConnState(myTcpConnState);
}
else
{
myUDP= new clsUDP(sIp, iPort);
myUDP.ShowConnState = new clsUDP.dgShowConnState(myUdpConnState);
}
}
void myTcpConnState(clsTCP sender)
{
//...
}
void myUdpConnState(clsUDP sender)
{
//...
}
}
###现考虑重构设计方案为:
1.将A改为抽象类:
public abstract class A
{
public SocketBehavior socketBehavior;
public void DoCreateSocket()
{
socketBehavior.CreateSocket();
}
//...
}
2.为以后扩展方便,新建以下接口及实现类
public interface SocketBehavior
{
void CreateSocket();
}
public class TCP : SocketBehavior
{
private clsTCP myTCP = null;
public void CreateSocket()
{
myTCP = new clsTCP(sIp, iPort);
myTCP.ShowConnState = new clsTCP.dgShowConnState(myConnState); //
}
}
public class UDP : SocketBehavior
{
private clsUDP myUDP = null;
public void CreateSocket()
{
myUDP = new clsUDP(sIp, iPort);
myUDP.ShowConnState = new clsUDP.dgShowConnState(myConnState); //
}
}
###请问:
1.如何使新设计中的接口的实现类的委托方法myConnState,在抽象类A或其继承类中实现?
2.或有更好的重构设计方案?
------解决方案--------------------看得清代码,但问题不是很能理解
你里面没用到委托.但想实现委托是吧
不过你那个myConnState的事必要的事件,为何需要引入委托呢.
别把程序搞得复杂化
------解决方案--------------------
C# code
public abstract class A
{
private ISocketBehavior socketBehavior;
public A(ISocketBehavior socket)
{
this.socketBehavior = socket;
this.socketBehavior.ShowConnState = new clsUDP.dgShowConnState(ConnStateAction);
}
protected virtual ConnStateAction(); //子类实现具体的操作
}
------解决方案--------------------
一个代码运行的好好的,为什么要重构?就是因为看着不顺眼?
请不要滥用“重构”这个概念。你的做法叫做“推倒重新设计”而不叫做重构。
当你推倒重新设计的时候,记住尽量简化,不要用一些很雷人的概念。
依我看,你的代码推到重新设计的时候,删除A就完事了。这样在没有画蛇添足的A的情况下,原本使用A类对象的程序直接使用clsTCP 或者clsUDP类对象,而不必去绕个圈子去使用什么A、myTcpConnState、myUdpConnState。
真正的重构可能是为clsTCP、clsUDP规定同一个接口(或者父类)。重构无法解决你画蛇添足多余出来的很多类型这个问题。当你在多余的东西上重构,就好像吃进去的是垃圾拉出来的一定也是垃圾,不简化设计就优化不了系统。
------解决方案--------------------
技术、架构是为业务服务的。不是说你的技术有多牛,架构有多好。不是业务适应程序,而是程序适应业务。尽量简化设计,让程序开发人员轻松一些吧。。。
重构之前,最好是想想是否真正需要这样做,这样做的优点和缺点是什么,把问题罗列出来对比后再执行不迟。