为什么非要去定义这些东西啊?与其继承了这些东西然后再去实现他们,为什么不直接去实现这些想要的方法呢?
小白求大家指教啊~~~~
小白求大家指教啊~~~~
解决方案 »
- webbrowser 使用代理后,可以浏览网页但无法post数据?
- C#通过文件画线并选中所画的线进行删除等操作
- 文件删除问题!
- aspx 页面 怎么让秒钟同步
- 关于.Net remoting 对象的接口问题
- 怎样将DataRow[] drs=dsr.Tables[0].Select(ser)查询出的行添加到DataSet中呀??
- 各位大哥来帮帮小妹好吗~~~~很急呀~~~
- 关于DataGrid的行标头里的那个黑色三角箭头的疑问?
- 求助关于SQL语句中的特殊字符问题。。。
- 入门时奇怪问题?
- 使用vs2008创建excel2003工作薄出现错误,请指点
- C#中窗体类的继承问题,如何继承父类窗体的事件呢?
你有时间看看设计模式,我现在的项目要用SSH,发现作用还是很大的。
我只是觉着学了那么多语法的东西总要用的吧,可是不知道啥时候用为啥要用,所以想问问。
我是在自己写个东西,以前没有写的从没用过接口啥的(别鄙视我啊,我觉着哪个小白刚起步也不会上来就把各种OOP技术都使上去吧),这次想写个像点样子的东西所以就想最起码用到这些吧,可是不知道什么地方用,为啥用0 0
还求大牛稍微透露点。
比如说 我们的插座 市面上所有的电器不是两孔就是三孔 不可能来个一孔或者四孔 这就是为了和插座兼容 这样子插座才可以给你供电 这里可以理解为外部针对接口的调用 但是具体这个电给你了你怎么用 那就是电器自身的事情 这里你就可以理解为实现了接口的类
用代码表示就是
public interface IChaKong//插孔接口
{
void Enpower()//给电
}
public class TV:IChaKong
{
public void Enpower()
{
//放电视的操作
}
}
public class AirCondition:IChaKong
{
public void Enpower()
{
//空调制冷或者制冷的操作
}
}public class ChaZuo()//假设一个插座类(准确说应该是个接线板) 他包含三个插孔接口类型的变量
{
List<IChaKong> chaKongs=new List<IChaKong>();
public void Enpower()//这个相当于是把插座接上电
{
foreach(var temp in chaKongs)
{
temp.Enpower()//接口的方法 对于插座而言不知道插在插孔上的电器具体是在干什么
}
}
}public class Program
{
public static Main()
{
var chaZuo=new ChaZuo();
chaZuo.chaKongs.Add(new TV())//相当于给插孔插上一个电视
chaZuo.chaKongs.Add(new AirCondition())//相当于插了一个空调
chaZuo.Enpower()//把接线板插到电源上
}
}不知道这样的解释能不能说明白 个人感觉接口的作用更多的是要到实际编程里面去体会的
(1)如果我写一个代码交给lz维护,你是愿意在我的代码中改来改去呢,还是直接再按照一定规则编写一段代码来扩展呢?
(2)如果lz是一个框架库的编写者(这听上去有点高级),你的用户不再是最终用户,而是一些初级程序员,你如何让他们觉得你的框架库好用。比如你的框架库应该适应尽可能多的情况(这些情况你不能一一预料到并且写在代码中),同时还要避免他们修改你的代码(你的代码已经编译成dll了)。也许具体怎么做你不知道,但是看了我的两点,原则你已经知道了,那就是你编写的代码必须对功能的扩展开放(允许他们扩展功能),同时对修改关闭(程序本身不应该被修改,就像你不会随便修改System.Data,System.Web中的代码,实际上也没有代码给你修改)。这个原则很多程序员已经意识到了,于是简称为OCP(开放关闭原则)。那么接口、抽象类的作用是什么呢?它就是使得你的代码符合这个原则:我们看这么一个场景,我们编写的程序提供了日志输出的功能:foo()
{
...
try
{
...
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
...
}这个程序作为直接给最终用户编码的程序,显然没有什么问题。但是你可能意识到了,这个程序只能在控制台上才能显示错误,如果是在ASP.NET中,我们需要把输出的方式修改下才行。那么WinForms呢?我们还得修改。这对于一个通用的函数库来说,显得不可以接受。
当然你可以做一个判断,并且把这三种形式都包括在内。可是真的只有三种么?如果调用你的程序员说,我想把错误输出到日志文件中,你不得不再增加第四种输出方式。如果用接口,就没有问题了。我们定义一个接口:
ILogger
{
void WriteLine(string content);
}这个接口表示,我们允许用户传递一个可以包含WriteLine方法的类,具体什么类不重要,只要它能有这个方法就可以了。我们的代码修改如下:
foo(ILogger log)
{
...
try
{
...
}
catch (Exception ex)
{
log.WriteLine(ex.Message);
}
...
}这样,我们的程序就把输出到哪里从程序中提取出来了,让调用者决定。如果调用者在编写一个控制台程序,他可以这么用:
class ConsoleLog : ILogger
{
public void WriteLine(string content)
{
Console.WriteLine(content);
}
}
...
foo(new ConsoleLog());如果调用者在写asp.net程序,它只需要定义另一个类就可以了
class ResponseLog : ILogger
{
public void WriteLine(string content)
{
Response.WriteLine(content);
}
}
...
foo(new ResponseLog());很明显没,如果他想输出到文件,或者显示在别的地方,都只需要自己定义一个类,实现这个接口,再传进去就能办到了。也就是不修改你的代码,在你的代码上扩充,实现无限的扩展。这就很好回答了最初的两个问题。
public class ChaZuo() ???这是类无()
抽象类:抽象类比接口多了一些细则的东西,比如抽象类可以实现一些方法,定义一些属性。比如说,我们现在的手机CPU有单核,双核,四核的。基本上都是基于ARM架构的,那么你肯定问,手机的cpu是ARM出产的吗?不是,ARM只是做CPU架构,然后其它厂家购买这种架构生成基于这种架构的CPU,所以我们手机里面有三星的,高通的,但是架构都大同小异。所以对于生产厂家来说,ARM就是抽象类,而具体的生产厂家就是实现类表达能力不是很好,这个问题面试的时候经常问到。我是觉得以个人的理解讲解比搬标准的定义要好一些。
而不是每个设备都弄一个接口,电脑也弄不出那么多洞。
作用就是标准化,减少冗余代码。
含义: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
方法名修饰符: abstract
实例化: 不能创建抽象类的实例
实现: 可以有选择性地实现需要用到的方法(即重写)
是否能包含已实现的方法: 可以,即不一定要求所有方法都是抽象的
继承: 单
接口:
含义: 抽象类的变体
方法名修饰符: abstract
实例化: 不能创建接口的实例
实现: 必须实现所有的方法(即重写)
是否能包含已实现的方法: 不可以,即一定要求所有方法都是抽象的
继承: 单
含义: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
方法名修饰符: abstract
实例化: 不能创建抽象类的实例
实现: 可以有选择性地实现需要用到的方法(即重写)
是否能包含已实现的方法: 可以,即不一定要求所有方法都是抽象的
继承: 单
接口:
含义: 抽象类的变体
方法名修饰符: abstract
实例化: 不能创建接口的实例
实现: 必须实现所有的方法(即重写)
是否能包含已实现的方法: 不可以,即一定要求所有方法都是抽象的
继承: 多
大多数游戏都有多种职业,那么你需要定义一个职业的interface,这个interface中有一个方法attack。
那么你的程序在执行的时候,对于所有职业来说都有attack这个方法,是不是简单多了?如果你是每个类都去单独实现的话,那么你必须将每个职业都设置一个attack的方法,这样你的程序才好写,也许我说明不是很好,但是大致意思就是所有职业因为继承了职业的interface,那么他们都有一个统一的attack方法,也就是标准。
抽象类的话,跟interface差的不是很多,抽象类的子类必须实现抽象类中的抽象成员,否则编译不通过。
这样说,如果你写了一个类,其中有一个方法fun。你知道了你写的类将会被别人拿去继承,但是你又担心别人写的子类中不会去实现fun方法,也fun方法将在你的程序中是一个不可缺少的方法,那么你只需要将fun设置为抽象的就可以了,那么别人继承你的类的时候,fun方法必须实现了,那么你的主程序中调用fun的时候就不会出现调用了null方法的问题。
我对多态理解的也是很糊涂,之前看JAVA编程思想开头就在讲面向对象思想,里面说的多态我感觉很神奇,可在有的书里说方法的重载就是多态?
我的理解那是不是泛型和变量数组也是多态的一种体现啊?
让我想起了JAVA思想里说的那个鸟例子,
小弟愚笨在代码里怎么体现多态呢
代码里面体现。难道要我贴代码?这样吧,我把上面的例子发散一下:
动物换成狗,狗有一个方法fun,那么狗生下的两只狗A和B也都有方法fun,如果主人对两只狗拍手,也即调用fun方法。
狗仔A会摇尾巴,狗仔B会咬主人一口。大致就这样了。
楼主,接口,这个 概念其实是为了标准,
不知道你做过网页没有……像<html>,<a></a>这样的标签,每个浏览器都要支持它,你要问为什么要支持它,因为好多程序员都要调用它!!很多程序员都被灌输这样的概念,比如说看到<a href='www.baidu.com'>百度</a> 就知道这是一个链接到百度的超链!!还比如说:JS函数 document.getElementById("myid");这句话;浏览器的制造厂商要让程序员调用它的时候会产生“得到ID为‘myid’的标签的值”的这种效果!!具体它是怎么实现的,我们不知道!!我们调用的时候,只管它产生的后果!!!那些浏览器厂商,像微软,谷歌,苹果,还有像什么搜狗,腾讯的都要让“程序员”在调用这些“接口”的同时都要产生一致的效果!!!这就是接口的作用!!!
其实吧!!像C# 的语吧吧!!你为啥要这样子写呢!!因为这是个标准!!你要是写错了,编译器就不认识你!!可能你一直用一些像VS,esclipse这样的智能工具,所以你就漠视了这些概念!!
说白了!!接口是啥,接口就是:能让别人调用,并会产生一致性效果的东西!!!像C#,Java里的那些关键字,系统函数啥的都可以称为“接口”!!接口只是为了一致性的东西!!!你不要认为它很神性!!它就是抽象出的一种概念而己!!!