当前位置:编程学习 > C#/ASP.NET >>

接口、抽象类、继承应该在什么时候使用。

我是一个C#的自学者,想知道接口、抽象类、继承在什么时候应该使用?
他们何时该出现。 --------------------编程问答-------------------- 泰泛泛了,没法讲,看看设计模式吧 --------------------编程问答-------------------- 学一些UML之类的设计入门知识,然后用代码来实现你的设计。如果只是抄别人的代码,你只能理解一些数值计算之类的、跟实际领域模型没有多少关系的纯粹计算机的小程序。 --------------------编程问答-------------------- 一句两句说不清楚

你做多东西了,自然会感觉他们的不同!! --------------------编程问答-------------------- 单纯地等值“别人让你干什么你就干什么”的这种编程,没有什么技术含量。拿一张餐巾纸,在上面画出十几个类的类图,以及主要行为的活动图,界面布局示意图,等等必要的设计草图,然后才回到家去编程。这才有技术含量。 --------------------编程问答--------------------
引用 3 楼 jayinit 的回复:
一句两句说不清楚

你做多东西了,自然会感觉他们的不同!!


我才接触C#,也没有编程经验。 --------------------编程问答--------------------
引用 4 楼 sp1234 的回复:
单纯地等值“别人让你干什么你就干什么”的这种编程,没有什么技术含量。拿一张餐巾纸,在上面画出十几个类的类图,以及主要行为的活动图,界面布局示意图,等等必要的设计草图,然后才回到家去编程。这才有技术含量。


我没有编程经验,也没有从事过编程的工作。我是做SEO的。 --------------------编程问答-------------------- 等到一定的代码量后
看<HeadFirst 设计模式> --------------------编程问答-------------------- UML等等是用来“画画图”,但是它从根本上就给你讲清了为什么要继承、接口,以及其它设计要素。为什么不从这类基本的技术开始学习编程呢?不要只学某个编程语言的语法。 --------------------编程问答--------------------
引用 8 楼 sp1234 的回复:
UML等等是用来“画画图”,但是它从根本上就给你讲清了为什么要继承、接口,以及其它设计要素。为什么不从这类基本的技术开始学习编程呢?不要只学某个编程语言的语法。


恩。谢谢指导。今儿回去去下一个UML来研究研究。 --------------------编程问答-------------------- 面向对象程序设计基础! --------------------编程问答-------------------- 接口:在执行并调用方法时,不必知道对象的类型
抽象类:c#所有的东西都是在类中实现的
继承:比如说一个收费系统,写好的类是一种收费模式,如果有别的收费模式,可以继承这个类来实现 --------------------编程问答-------------------- 面向对象思想的一个最重要的原则就是:面向接口编程。   
接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系;   
接口多定义对象的行为
如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。  
--------------------编程问答-------------------- 看看设计模式 --------------------编程问答-------------------- 先讲继承吧,当你多个类中都有相同的字段的时候,这时候如果各写各类中就会出现代码冗余的状况,这时候我们就要用到继承了,这样很好的解决了代码复杂的问题。
抽象类的应用场合:由于抽象父类中提供的抽象方法,要在子类中共实现。因此我们可以这样理解,父类提供了一个功能或者规定,约束子类的行为。
例如,猫和狗继承自动物类,猫能喵喵叫,狗也能够汪汪叫,如果动物是一个抽象类,它里面有一个抽象方法“叫”,就可以理解为:是动物就要会叫。

接口:是对继承单根性的一个扩展,它变相的实现了无法继承多个父类的问题,一个类不能继承多个父类,但是可以有多个接口。它是某类行为或功能的抽象,是一种规范或者标准,或者说是一种契约。所以从字面上来理解就非常清楚了,西方神话有很多和魔鬼定下契约来使自己的力量得到提升的故事,你必须下这个契约才能得到你想要的力量。
不知道楼主你现在能明白多少呢? --------------------编程问答-------------------- 看一本书 大话设计 通俗易懂 就明白怎么使用了~~ --------------------编程问答-------------------- 楼主别急,刚学这个不明白很正常,我也是好长时间才明白的,我也不给你说具体的怎么使用,因为楼主没有代码量,等楼主有一定的基础以后,这些东西你自然就要使用,都不需要别人教你,就是传说中的顿悟! --------------------编程问答-------------------- 抽象不仅仅是软件领域,在有灵性的生物中都有抽象;
抽象不仅仅是OO的,非OO语言也有抽象;


抽象的级别:
类级别的抽象--类、抽象类、接口;
方法、函数级别的抽象--泛型、委托、Lambda表达式;
组件级别的抽象--业务组件,数据访问组件,UI控件;


解决方案的抽象-设计模式;
系统级别的抽象--AOP,SOA
应用级别的抽象-应用框架;


1,物以类分,人以群聚--类,抽象类,接口的关系。
将事物分类(class),是我们认识世界的一种重要方式,也是一种重要的思维方式,所以把我们周围的对象(object)划分成一个个的类,将大类再
细分成小类,例如由分子到原子,由原子到电子。所以,“类”是“对象”的抽象,是我们认识世界的“一级抽象”。


某些类还可以再抽象吗?
当然可以,将类的某些共同特性进一步进行抽象就是抽象类(abstract class),我们举一个例子说明它们之间的关系:


类是可以被实例化的,例如
class 人
{
  string 名字;
}


现在有一个叫做张三的人,我们这样表示:


人 man=new 人();
man.名字="张三";


这里,“人”这个类被实例化成“张三”了。
我们现在向上寻找“人”归属与那一类,很自然,“人”类属于“动物”类,我们修改一下“人”类的定义,让它继承一个父类“动物”类:


class 人:动物
{
...
}


问题来了,我们可以用“动物”类实例化出“张三”来吗?我们逆向思维一下,说到张三,我们就可以直接的想到他是一个人,而不是先想到他是一个动物,
况且,说到动物,我们想到的是猫、狗、狮子老虎之类的东西,显然,我们不能用“动物”类实例化张三,我们说“动物”类是抽象的,它不是一个具体的类,所以我们的动物类应该这样定义:


abstract class 动物
{...}




现在我们来观察一下“动物”类具有哪些方法,直接用代码说明:


abstract class 动物
{
void 吃东西();
void 睡觉();
void 叫声();
}


class 狗:动物
{...}


class 猫:动物
{...}


这样我们的狗 dog 和 猫 cat它们都会吃东西,睡觉,并发出叫声了:
狗 dog=new 狗();
猫 cat=new 猫();
dog.叫声();//汪汪
cat.叫声();//咪咪


现在看起来都没有问题,看来我们的抽象类工作的很好,有一天问题来了,我们买了一只玩具狗,它也会“汪汪”,我们可以这么写吗?


class 玩具狗:动物
{...}


显然上面这样写是错误的,玩具狗不是动物,但它的“叫声”怎么处理呢?
现在,我们需要对抽象类进一步抽象了,我们只需要它原来的一部分东西,例如,我们只需要把动物抽象类中的“叫声”抽象成
一个接口,况且叫它“叫声接口”,对原有的代码进行以下改进:


interface 叫声接口
{
void 叫声();
}


class 动物:叫声接口
{...}


class 玩具狗:叫声接口
{...}




玩具狗 dog1=new 玩具狗();
dog1.叫声();


-------------
•非常好,我们的玩具狗正常工作了,没有和动物类混杂到一块去,我们来总结一下类、抽象类、接口的一些区别:



•类:是现实世界中“对象”的“直接”抽象;(请注意“直接”二字)



•抽象类:是对数个类的某些“共同概念”上面的抽象,它不是实际的,它有一些抽象的特性必须由它的子类去具体实现;(请注意“概念”二字)



•接口:是不相关的一组类中的某些特性的抽象,它约定了不同的类直接的某种联系,或者说“契约”;(请注意“不相关”的相对性)





================
到这里,我们完成了对我们世界的“初级抽象”,至于更高级的抽象,我们下篇再说。 --------------------编程问答--------------------
引用 8 楼 sp1234 的回复:
UML等等是用来“画画图”,但是它从根本上就给你讲清了为什么要继承、接口,以及其它设计要素。为什么不从这类基本的技术开始学习编程呢?不要只学某个编程语言的语法。

好好学习一下 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 9 楼 yudgtg 的回复:
恩。谢谢指导。今儿回去去下一个UML来研究研究。

UML不是个软件,你没处可下的...

嗯,就算你把UML当成语言吧...当你对OO一无所知却想把UML当一门语言来学时,你会发现你欠缺更多基础知识...不过这是好事,至少方向正确了... --------------------编程问答--------------------  我想我哪天能顿悟。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 21 楼 liu0734 的回复:
 我想我哪天能顿悟。。


同意,是需要顿悟。说那么多,没到那个层次,看也看不懂,最多似懂非懂。 --------------------编程问答-------------------- 接口:面向对象编程=面向接口编程
抽象:比如说你定义了一个类,它有些方法你不知道怎么去实现,你去把这个方法声明为抽象的(这个类也变成了抽象类,包含抽象方法的类一定是抽象类),让它的子类去实现,如果它的子类也不知道怎么去实现,再把子类的这个方法声明为抽象的,再去它的子类的子类去实现......
继承:可以代码重用,比如说学生,老师他们都是人,都具有姓名,年龄,性别等相同属性,又具有吃饭,睡觉等相同的方法,这样你就可以让学生,老师都继承人,在人中定义这些学生和老师所共有的属性和方法。 --------------------编程问答-------------------- 登录时:写入cookie:
 CookieManager.WriteCookie("CssInfo", theme, DateTime.Now.AddYears(1));

再次访问时:读取cookie:
CookieManager.ReadCookie("CssInfo") != null && CookieManager.ReadCookie("CssInfo").Length > 0 --------------------编程问答-------------------- 抽象类一般做父类,通常定义属性。继承一般是 IS A的关系
比如:鸡 和鹰 都是鸟类,满足 鸡 IS A 鸟,鹰IS A 鸟。所以可创建一个抽象类 鸟类为它们的父类

接口一般是 CAN DO 的关系 ,通常定义行为。
比如  鸡 和鹰 虽然都是鸟类 ,但鹰能飞翔, 鸡不能。所以可以创建一个接口,里面有飞翔的方法,鹰实现这个接口,鸡不实现这个接口来区分。

另一点就是 只能继承一个父类, 可以继承多个接口

这样说你明白吗 --------------------编程问答--------------------
引用 8 楼 sp1234 的回复:
UML等等是用来“画画图”,但是它从根本上就给你讲清了为什么要继承、接口,以及其它设计要素。为什么不从这类基本的技术开始学习编程呢?不要只学某个编程语言的语法。


这个我赞同。 --------------------编程问答-------------------- 看OOP吧 --------------------编程问答-------------------- 一般编程使用不到的。。。。
 1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
 2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
 3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。   
 4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

--------------------编程问答--------------------
引用 17 楼  的回复:
抽象不仅仅是软件领域,在有灵性的生物中都有抽象;
抽象不仅仅是OO的,非OO语言也有抽象;


抽象的级别:
类级别的抽象--类、抽象类、接口;
方法、函数级别的抽象--泛型、委托、Lambda表达式;
组件级别的抽象--业务组件,数据访问组件,UI控件;


解决方案的抽象-设计模式;
系统级别的抽象--AOP,SOA
应用级别的抽象-应用框架;


1,物以类分,……
说的真棒,你还有这方面的日记没? --------------------编程问答-------------------- 用了这些东西只会 你就慢慢会从写程序 变成设计程序 --------------------编程问答-------------------- 举个例子吧 我要调用一个服务 ServiceA ServiceA是从IServiceA出来的 我在代码里面会这么写 
IServiceA serviceA=new ServiceA();
哪天如果我逻辑变了 换了个逻辑 或者仅仅加了一些逻辑进去 就可以写个ServiceACustom 继承IServiceA 这个时候你的代码就要变成IServiceA serviceA=new ServiceACustom(); 
因为还是要改代码 所以说并没有做到解耦 但是IServiceA这个是没变的 这个时候我们有两种方法 就是做简单工厂 我不直接new 而是通过一个ServiceAFactory类的CreateInstance()方法 通过读取配置文件等方式 来动态的产生这个serviceA 这样 你就不用改代码 就做到了这种需求的变化 其实这个例子 就是个简单的依赖注入 也称IOC,java下面有个经典的IOC容器就是spring,.net下面也有叫做spring.net 你如果有用过这种框架写过什么东西 就知道为什么要有接口 抽象类 继承了 --------------------编程问答--------------------
从实际的项目、工程中去体会这些特性的应用吧。比纸上谈兵来得实际一些。


--------------------编程问答-------------------- http://blog.sina.com.cn/s/blog_63257de20100gzgd.html
看看这篇文章 --------------------编程问答--------------------
引用 34 楼 XinYaping 的回复:
从实际的项目、工程中去体会这些特性的应用吧。比纸上谈兵来得实际一些。


支持
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,