由最简单的例子理解接口的实例化和面向接口编程
来源:互联网 发布:d3.js 鼠标右键 编辑:程序博客网 时间:2024/06/06 07:31
转载请标明出处: http://blog.csdn.net/programming_snail/article/details/50488121
出自:Panda_Wang_
主要写写自己对接口实例化的理解:关于接口大家应该都清楚,类实现接口必须实现接口的所有方法,属性除外。那么既然有类来实例化接口,那么为什么还要把类的实例转换为接口,也就是我们所说的接口的实例化。这样一来一回岂不是多此一举,自找麻烦?
其实面向对象的概念里面推荐的一条就是面向接口编程,拿到接口的实例,我们不必关注类方法具体实现的细节,面向接口编程可以降低程序之间的耦合度,是指说在具体的调用处都是接口去进行的,并不依赖于具体的某一个类。
比如说定义了个I接口,有两个fun1,fun2方法。然后有三个类实现了该接口:
I i1 = new A();
I i2 = new B();
I i3 = new C();可以有很多个类实现了该接口,但当我们还没实例化的时候,我们可以I i直接拿来用,i.fun1,i.fun2可以提前编程,我们可以直接对i来进行编程设计,具体的取那一种实例由以后需求变化的时候我们自己选择,我的理解是:这样的好处叫做提前编程,我可以先把这个类(接口的实例),在他还没实例化的时候拿来用,以后等他具体实现了再给赋实例值,当然这种说法是我自己的理解。
其实面向接口编程用的地方非常多,有时候我们也经常写,绝对用到他了,只不过没注意罢了,由最简单用的最多的地方说说吧。下面是最简单的一个点击Button事件
import com.example.com.cn.wp.test1.R;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener{ private Button mBtn1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtn1 = (Button) findViewById(R.id.id_btn1); mBtn1.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.id_btn1: Toast.makeText(MainActivity.this, "id_btn1", Toast.LENGTH_SHORT).show(); break; default: break; } }}
- setOnClickListener(this)这是我们经常写的方法吧,有时候还总会丢掉这句代码,来看看原理以后就不会漏了。通过setOnClickListener(this)来给具体的实例化接口赋值,这里就是刚前面所说的:具体类实现的时候再给他赋值,即this。因为这里是BUTTON mBtn1调用setOnClickListener给他赋值了,那么我们可以推测并证明一个问题:BUTTON类或BUTTON的父类,肯定是提前用这个接口了,并且调用OnClickListener接口的onClick()方法,否则谁知道你点击的OnClick方法了,可以找源码来看看:
- 继承关系图层次:Button->TextView->View,在View.class里面我们找到了,如下:
//具体OnClickListener接口,就一个方法 public interface OnClickListener { void onClick(View v); }
//接口声明 public OnClickListener mOnClickListener;
//接口的赋值,也就是接口的注册 public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; }
- 可以看到先是对isClickable的判断,这里先不看,最后将实例赋值给getListenerInfo().mOnClickListener,其中getListenerInfo()是拿到view的一个静态内部类ListenerInfo的实例,该实例内部就有我们需要知道的mOnClickListener接口,通过接口的实例来掉用OnClick();下面是两处的调用代码:
//具体调用OnClick()点击事件的方法 public boolean performClick() { sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); li.mOnClickListener.onClick(this); return true; } return false; }
//具体调用OnClick()点击事件的方法 public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; }
- 这就是提前编程了,也就是我们常说的接口回调,在view类里面我们就已经通过mOnClickListener.OnClick(this)来调用这个方法了,该方法的最终的实现做什么事是放在了MainActivity的OnClick方法我们具体来实现了,而android的架构师并不知道我们后面怎么处理,自己先用,以后留给我们去填这个实例,即setOnClickListener(this)。
- 没多少内容,都是自己的理解,学习理解好面向接口编程,对项目程序的扩展性和架构都是很重要的,有什么错误的地方还望多多给我留言了。下一篇写写具体怎么在项目中来用的。
- 由最简单的例子理解接口的实例化和面向接口编程
- 接口、抽象类和面向接口的编程
- 学习面向对象编程和面向接口编程的区别?
- 面向接口编程和面向对象编程的区别
- 对面向接口编程的理解
- 对面向接口编程的理解
- 对面向接口编程的理解
- 对面向接口编程的理解
- 面向接口编程和面向实现编程
- 面向“接口”编程和面向“实现”编程
- 面向对象编程和面向接口编程
- 面向“接口”编程和面向“实现”编程
- 面向“接口”编程和面向“实现”编程
- Spring IOC 和面向接口编程
- MVC 模式和面向接口编程讲解
- PHP5的接口技术和面向对象中多态的应用
- 由Simple MVVM框架延伸对接口编程的理解
- java接口类的最简单的例子
- 异步加载数据 jQuery $.getJSON
- VS编译duilib项目时候的错误解决方法整理
- Java类当中初始化模块
- poj3468 A Simple Problem with Integers(Splay)
- WenGoat实验之Inptoper Error Handling(错误处理不当)- 2016.01.09
- 由最简单的例子理解接口的实例化和面向接口编程
- 第1章第2节 线性表的链式表示(2)
- python文件中 `if __name__ == '__main__':` 的作用
- 用自己的keystore替换eclipse默认签名文件
- 关于Unity3D接入SDK之后,游戏中的文字输入框无法输入内容的问题
- 牛客网 | 碰撞的蚂蚁
- iOS 枚举
- eclipse自动补全代码以及jadoc文档注释
- JavaEE框架Bootstrap、HTML5、jQuery、SpringMVC