问题描述
最近在学习大话设计模式。看代理模式的时候,书本代码如下:namespaceProxyClass{publicabstractclassSubject{publicabstractvoidRequest();}publicclassRealSubject:Subject{publicoverridevoidRequest(){Console.WriteLine("真实的请求");//thrownewNotImplementedException();}}publicclassProxy:Subject//我的问题是,这里为什么需要继承Subject类,不继承可以吗?{RealSubjectrealsub;publicoverridevoidRequest()//如果不继承,直接在此处写一个新方法{if(realsub==null){realsub=newRealSubject();}realsub.Request();//thrownewNotImplementedException();}}}
调用如下:staticvoidMain(string[]args){Proxyproxy=newProxy();proxy.Request();Console.Read();}
解决方案
解决方案二:
保持方法的一致性啊……让外部感觉用起来跟没代理是一个样
解决方案三:
不继承也可以的。不继承的话在Proxy类中写一个Proxy的单例模式构造也可以。
解决方案四:
有什么优缺点,或是什么原则之类的指导?
解决方案五:
引用3楼ykj_fj的回复:
有什么优缺点,或是什么原则之类的指导?
继承是软件工程的需要,用在多态性功能中。也就是说,针对subject而设计的代码根本不管什么proxy、根本不知道proxy是什么东西,但是将来可以被proxy所“插入”和修改。这是因为proxy类型的对象是对subject类型对象的“既继承又重写”,因此保证了接口可调用、同时又可以功能扩展。
解决方案六:
学习“软件工程基本知识”跟“学习c#编程语法”的区别,可以用一个建筑设计师跟工地上的搬水泥的小工的区别做比喻。前者需要研究、设计各种预制件在工厂中的制造方法,和各种工艺规范,并不断重构设计(在1分钟之内就把整桩大厦的立体模型重新计算出来了);而后者眼中的大厦是一块一块拼凑起来的,看不到设计和重构的作用。站在后者的角度,也就是说只知道一点编程语法而没有学习软件工程基本知识,就无法比较全面一些地看到继承和多态的作用。
解决方案七:
用了抽象类,就是为了保持行为的一致性..