【c# 学习笔记】面向对象编程的应用
在平时的开发过程中,面向对象编程的应用肯定必不可少。但前面的内容只是单独介绍了类、面向对象思想和接口,那么我们怎么在平时工作中来应用他们来实现面向对象编程呢?
如果你想设计一个Dog类,有了类的概念后,你可能会响下面这样去实现它:
public class Dog
{
public void EatFood()
{
//eat some food
} public void Walk()
{ }
}
但是Dog类中的EatFood和Walk方法有可能被其他类用到,他们都是动物的共同特性。此时你应该考虑使用面向对象中的继承思想,重新设计代码。
使用继承后的代码如下。其中添加了Animal类来封装公有的EatFood方法和Walk方法,这使得其他继承于Animal的子类都可以使用这两种方法,因此更好地重用了代码。
public abstract class Animal
{
public void EatFood()
{
//eat some food
} public void Walk()
{ }
}
public class Dog:Animal
{ }
如上,使用继承达到了重用代码的效果,但是不能过度使用继承,否则将导致派生类的膨胀,从而增加维护和管理的成本。如果必须过度使用,可以考虑通过接口来实现。
1.解决方案一
此时很容易想到在Animal类的定义中添加一个Show方法。
public abstract class Animal
{
public void EatFood()
{
//eat some food
} public void Walk()
{ } public void Show()
{ }
}
public class Dog:Animal
{ }
然而这种设计会把Animal概念本身固有的行为方法和另外一个特殊概念的“表演节目”的行为方法混在一起。并不是所有的Dog都具有表演节目的行为方法,而上面的设计会导致所有继承于Animal的动物都获得了表演节目的行为,这显然不符合现实情况,方案一不可取。
2.解决方案二
既然EatFood、Walk和Show方法属于两个不同的概念,所有应该把他们分别定义在代表这两个概念的类中。定义方式有3种:定义两个抽象类;一个概念使用抽象类,另一个使用Interface方式定义;两个概念都使用interface来定义。
显然,因为C#语言不支持多重继承,两个概念都使用抽象类来实现是不可行的。而若两个概念都使用interface定义的话,从程序角度来说并没有什么问题,但从现实角度考虑,则显然不合理,因为Dog本身属于Animal,这并非接口所表达的CAN-Do的关系。
所所以正确的设计应该是一个概念使用抽象类,另一个使用interface方法定义:两个概念都使用interface来定义。
显然,因为c#语言不支持多重继承,两个概念都使用抽象类来实现是不可行的。而若两个概念都使用interface定义的话,从程序角度来说并没有什么问题,但从现实角度考虑,则显然不合理,因为Dog本身属于Animal,这并非接口所表达的CAN-DO的关系。
所以正确的设计应该是一个概念使用抽象类,另一个使用interface。如下:
public abstract class Animal
{
public void EatFood()
{
//eat some food
} public void Walk()
{ } } public interface IAnimalShow
{
void Show();
}
public class Dog:Animal
{ } public class SpecialDog:Animal,IAnimalShow
{
public void Show()
{ }
}
【c# 学习笔记】面向对象编程的应用的更多相关文章
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- ufldl学习笔记和编程作业:Feature Extraction Using Convolution,Pooling(卷积和汇集特征提取)
ufldl学习笔记与编程作业:Feature Extraction Using Convolution,Pooling(卷积和池化抽取特征) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰 ...
- ufldl学习笔记和编程作业:Softmax Regression(softmax回报)
ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...
- ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)
ufldl学习笔记与编程作业:Softmax Regression(vectorization加速) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learn ...
- ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)
ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...
随机推荐
- [笔记] 三元环 && 四元环计数
Thanks to i207M && iki9! 三元环计数 无向图的三元环计数 我们首先需要对无向边按一定规则定向: 设 \(in[u]\) 表示 \(u\) 的度数 若 \(in[ ...
- Ftp客户端需要TSL功能的文件上传
Ftp客户端需要TSL功能 1.由于最近做了一个项目,需要把打包的文件传输到对方的FTP服务器上,但是用普通的java连接ftp客户端总是连接不上去,对方却说ftp客户端需要开通TSL功能. 直接上代 ...
- js的新生代垃圾回收
推荐阅读:https://www.cnblogs.com/chengxs/p/10919311.html 在进行老生代的标记清除法回收以前,还会有一个新生代的垃圾回收算法执行. 新生代和老生代 所谓新 ...
- nodejs+supertest+mocha 接口测试环境搭建
系统接口自动化测试 该框架用于对系统的接口自动化测试(nodejs+supertest+mocha)Homebrew 安装: ruby -e "$(curl -fsSL {+}https:/ ...
- 【HDU4622】Reincarnation
[HDU4622]Reincarnation 一眼似乎不可做,但发现\(strlen(x)\)很小,暴力\(O(n^2)\)预处理每个区间\((l,r)\),查询时\(O(1)\)输出就好了 #inc ...
- 物聯網安全黑客松 IoT Security and Privacy Hackathon
感覺這次黑客松的程度屬於初階,但是節奏很快,內容緊湊.概念部分解說較多,以致實驗時間縮短,有些只能看demo有點遺憾.幸好有video-taped,事後回溯可以看看能不能replicate實驗.總體而 ...
- docker容器里面执行top报“TERM environment variable not set.”
解决: [hadoop@master ~]$ docker exec -ti 6eca7d27a988 /bin/bashroot@6eca7d27a988:/# topTERM environmen ...
- ES6---修饰器
类的修饰 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableCl ...
- mysql8安装与卸载
参考: https://www.cnblogs.com/zxwen/p/9448797.html https://blog.csdn.net/weixin_30073553/article/detai ...
- Linux中man命令的使用方法再解释
原文链接:http://www.linuxidc.com/Linux/2017-03/142407.htm Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下 ...