日期:2014-05-20  浏览次数:21072 次

接口、抽象类中涉及委托,如何设计和实现?
代码要做重构,需重新设计。
###原代码实现如下,类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规定同一个接口(或者父类)。重构无法解决你画蛇添足多余出来的很多类型这个问题。当你在多余的东西上重构,就好像吃进去的是垃圾拉出来的一定也是垃圾,不简化设计就优化不了系统。
------解决方案--------------------
技术、架构是为业务服务的。不是说你的技术有多牛,架构有多好。不是业务适应程序,而是程序适应业务。尽量简化设计,让程序开发人员轻松一些吧。。。

重构之前,最好是想想是否真正需要这样做,这样做的优点和缺点是什么,把问题罗列出来对比后再执行不迟。