oop好处
简单说一下oop的好处。
1,组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
2,抽象性 - 程序有能力忽略正在处理中信息的某些方面,也有我们平常说的面向接口编程。
3,封装 - 确保类或者对象不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。
4,多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。
5,继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,实现了动作的通用性。
然后有对其权限控制的几个关键词,public、protected、private等。
private关键词
习惯认为private的函数,在外面是不可访问的,常见的语言入如python,java,php。但是其实都是以有方法突破其private修饰的函数然后对其访问。所以private这个东西是一个语言层面的一个规范,或者是一个实现约束,不是必须是这个样子的。
下面列出主要语言实现的方法。
Python的调用私有方法比较奇怪,私有方法的是用双下划线开头“__”,其私有方法是“下划线+类名+私有方法”。php和java都是使用reflect来调用私有方法。
Python:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class Test(object):
def __init__(self):
pass
def run(self):
print "public function run"
def __t(self):
print "private function __t"
if __name__ == "__main__":
o = Test()
o.run()
//o.__t() //AttributeError: 'Test' object has no attribute '__t'
o._Test__t()
java:
package com.mt.demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by ruimeng on 2017/3/8.
*/
public class PrivateCall {
public static void test(Object o) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class c = o.getClass();
Method m = c.getDeclaredMethod("t2", null);
m.setAccessible(true);
m.invoke(o, null);
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Object o = new MyTest();
test(o);
}
}
class MyTest {
public static void t1() {
System.out.println("public void t1");
}
private void t2() {
System.out.println("private void t2");
}
}
php:
<?php
/***************************************************************************
* Test private
**************************************************************************/
class MyClass {
public function __construct() {
//echo "new Test";
}
private function run() {
return "private function run";
}
}
class MyTest extends PHPUnit_Framework_TestCase {
const CLASS_NAME = 'MyClass';
protected $obj;
/**
* @brief setup like __construct
* @return
*/
public function setup() {
$this->obj = new MyClass();
}
/**
* @brief getPrivateMethod
* @param $name
* @return method
*/
protected static function getPrivateMethod($name) {
$refObj = new ReflectionClass(self::CLASS_NAME);
$method = $refObj->getMethod($name);
$method->setAccessible(true);
return $method;
}
public function testPrivateFun() {
$testCase = 'private function run';
$testFunc = self::getPrivateMethod('run');
$rs = $testFunc->invokeArgs($this->obj, array());
var_dump($rs);
$this->assertEquals($testCase, $rs);
}
}
/* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */