多态方面,感觉不好实现,不过还是想问下
以下代码,想用多态方式来替换if else,网上说的最多的是 if 判断的时候是判断类(class)的类型
而非整形或者数字类型。
如果 if 判断的是类类型,确实容易用多态实现。
下面的例子是整型值判断。我想求教下各位,这样能不能用多态的方式实现,或者给写建议,谢谢各位了
- Delphi(Pascal) code
procedure TForm1.proc1();begin ShowMessage('proc1');end;procedure TForm1.proc2();begin ShowMessage('proc2');end;procedure TForm1.proc3();begin ShowMessage('proc3');end;procedure TForm1.ExtractedMethod1;begin if ComboBox1.ItemIndex = 0 then begin proc1; end else if ComboBox1.ItemIndex = 1 then begin proc2; end else if ComboBox1.ItemIndex = 2 then begin proc3; end;end;[解决办法]
从这个例子看,“多态”需求不是必须,改成case足矣
[解决办法]
写成多态,个人觉得更绕圈子,直接一个CASE语句就可以搞定的
[解决办法]
赞同用case
[解决办法]
我感觉也是写成case语句判断就可以了。
procedure proc(index:integer);
Begin
case index of
0:;
1:;
end;
end;
判断index值就可以了。如果感觉index不直观,可以声明成枚举类型。
[解决办法]
呵呵,楼主用心良苦啊!不过从上面的代码看来确实不需要用多态啊....
[解决办法]
如果想用的话,写个简单例子好了。
- Delphi(Pascal) code
type TCustomExternalController = class(TObject) protected procedure Step1; virtual; abstract; procedure Step2; virtual; abstract; .... //自己按需要加方法,这里只是随便给个例子 public procedure Execute; end; TNetController = class(TCustomExternalController) protected procedure Step1; override; procedure Step2; override; end; TUSBController = class(TCustomExternalController) protected procedure Step1; override; procedure Step2; override; end; TSerialPortController = class(TCustomExternalController) protected procedure Step1; override; procedure Step2; override; end;implementationprocedure TCustomExternalController.Execute;begin //如果这些东西执行的过程类似,可以把执行过程抽象到这个方法里,子类覆盖具体步骤即可 //关键字:模板模式。可参考TStream的实现方式。 Step1; Step2;end;
[解决办法]
http://blog.csdn.net/liangpei2008/archive/2009/05/20/4204743.aspx
[解决办法]
[解决办法]
不用多态也可以,以前C没有类时就有这种需求,delphi可以这样写:
p:array [1..3] of TProcedure; //定义指向过程的指针数组
...
初始化数组:
p[1]:= @TForm1.proc1;
p[2]:= @TForm1.proc2;
p[3]:= @TForm1.proc3;
...
调用:
p[ComboBox1.ItemIndex+1];
[解决办法]
比较有价值的帖,处理类似的情况我以前用的是接口
[解决办法]
实际的需求可能更抽象,大多数情况下不是一个类就能解决所有问题,而是应该根据业务来确定对象的粒度......