C# 子类实例化基类 基类使用不了子类的方法_老话题:6个方法,检验你有没有正确使用设计模式...
方法一:设计模式是为了消除继承
大部分设计模式,是让你在在面向对象的基础上尽量消除继承的手段。所以,如果你用了一些设计模式,减少了继承,那你八成用对了。如果你用了一大堆设计模式,然而继承却越来越频繁,那你100%用错了。
之所以说大部分,是因为个别设计模式(比如享元模式)是为了解决特殊场景特殊问题而生的。
方法二:良好的设计应该利于测试
一个设计合理的系统,因为解耦充分,各个模块独立性强,所以单元测试应该是比较容易写的。如果你用了一大堆设计模式,却发现给你写的类编写单元测试用例非常困难,那你一定是用错了。
方法三:多态是更好的if
多态的本质是运行期动态决定程序的分支走向,也就是“更好的if”,而设计模式,至少是《设计模式》那本书中提到的那些模式,基本上是基于多态的。所以如果你合理的利用设计模式,你设计出的代码应该有较少的if,如果你的代码越使用设计模式if越多,或者更直观地说,缩进越多,你一定犯了错误。
方法四:看不懂的模式先不要用
有些模式是很容易用错的,比如visitor模式,其实是为了解决java不支持double dispatch而存在的,然而其逻辑很晦涩。所以当你还在怀疑自己是否用对了设计模式的时候,你不应该使用这样的模式。
方法五:大部分类继承都是错误
类继承总的来说只有1.5种正确的打开方式:
- 第一种叫做模板方法(template method),是设计模式之一。这种模式说的是基类在一个抽象的层面实现了公有方法a,a依赖私有方法b,而b的实现是子类的工作。这种模式下,子类实现的虚方法b是不应该被外界调用的。当然有一种极端情况,b即使a本身(比如react中的render),此时模板方法蜕化为普通的多态。
- 第二种叫做mixin,类a通过继承一个基类b,获得某种相对独立的能力。然而这其实是一种不太好的设计,尤其是在需要mixin多种能力的时候,更合理的方式其实是在a内部创建b的实例。只是在比较简单的场景中,我们可以用继承糊弄一下,所以只能算0.5种。
除此之外,使用类继承基本上可以认为是错误的设计。
由此我们可以推论,在es6流行导致运行时mixin写法在前端不流行之后,前端代码中出现了一些新的设计错误。
方法六:不要模仿java的写法
设计模式是一回事,设计模式的实现是另一回事,这一点很重要。比如著名的观察者模式(observer),在java中有大量应用。然而我们常见的观察者模式样板代码之所以长那个样,是因为java中缺乏事件订阅系统。在c++/c#以及js中实现观察者模式,就没必要那样写。因为c++有std:function,c#有委托,而js函数干脆就是对象。
C# 子类实例化基类 基类使用不了子类的方法_老话题:6个方法,检验你有没有正确使用设计模式...相关推荐
- kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用
kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...
- C# 子类实例化基类 基类使用不了子类的方法_C#高级编程面试考题
一.简答题 1.简述C#中的所有访问修饰符及访问权限 private(私有的) 给类,及所有类成员使用 所有类成员的默认访问修饰符 可访问范围 当前类自身 public(公开的) 给类,及所有类成员使 ...
- C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...
一.构造方法 当创建一个类时, 系统会自动创建一个默认的无参构造方法, 这个方法和类同名, 在创建对象的时候自动调用. 默认的构造方法里面什么也没有, 重写之后就可以在创建对象的时候同时搞点事情了. ...
- C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性
这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构. 类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...
- 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类
常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式 ...
- [C++] - 纯虚函数 抽象基类 接口类
翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...
- python 基类 派生类_在Python中具有两个子(派生)类的继承示例
python 基类 派生类 In this program, we have a parent class named Details and two child classes named Empl ...
- c++继承 基类 派生类 虚函数
继承 类和类的关系有组合.继承和代理.继承的本质就是代码复用.子类继承父类中的一些东西,父类也称为基类,子类也称为派生类.派生类继承了基类除构造函数以外的所有成员. 继承的方式 继承方式有pu ...
- 提供羟基、羧基、醚基、酯基、氨基、磺酸基、烯基、苄基、腈基、胍类等功能性离子液体定制合成服务
提供羟基.羧基.醚基.酯基.氨基.磺酸基.烯基.苄基.腈基.胍类等功能性离子液体定制合成服务 根据阳离子分类,常规离子液体包含六大类:咪唑类.吡啶类.季铵类.季鏻类.吡咯烷类和哌啶类.功能化离子液体包 ...
最新文章
- 计算机组成原理文华学院,华中科技大学文华学院计算机组成原理课设.doc
- pytorch 索引
- jQuery .attr() vs .prop()
- [Noi2014]随机数生成器
- cobbler koan自动重装系统
- 怎样有效地推广APP
- [转载] python strptime函数转时间数组_python—时间与时间戳之间的转换
- 清理电脑文件夹中的Thumbs.db文件
- Jmeter创建大批量测试用户数据技巧
- 编写一个程序求解字谜游戏问题
- Virustotal使用
- 这个被上帝抛弃的国家,创立了全球一半的科技公司
- 宽带连接720错误代码解决办法
- 用html制作验证码英文数字,基于javascript实现数字英文验证码
- 计算机网络收集职业生涯规划的原则和步骤,职业生涯规划的步骤及原则介绍
- 快餐行业进入“黄金时代”,左手天堂右手地狱
- 基于单片机的贪吃蛇设计
- Java NIO(一)BIO vs NIO
- matlab 窄带高斯过程仿真,噪声干扰信号的Matlab仿真.doc
- Linux安装MATLAB 2017a