浅谈编程思想的重要性
作者:wfg2005
在面向对象编程里,其实你用什么语言不是最重要的,最重要的是OOP思想。也就是说在面向对象编程中我们要精心去理解的是面向对象的思想
而并非是语言,对于语言来说不管你用的是C++,还是java甚至是新语言C#,它们无非是语法不同。而这些语言(准确的说是所有的面向对象编程语言)
的构造者们在构造这些语言时,都是依据同样的面向对象思想构造。只是构造时采用的方式不同而已,当然除此之外可能在细节上也有所不同,因为这些语
言构造者们可能是站的角度不同或是看法不同,但是他们的“核心思想”都是相同的。对于面向对象中核心概念理解都是一致的。
我想不管我怎样的陈述我的观点。始终是抽象。读者也是难于接受的,所以接下来我就针对面向对象思想的“多态的”概念进行分析和举例
(举例时我将采 java,C#,C++ 进行比较来证明我的观点)
为了便于说明我先简单的介绍一下面向对象重要特怔之一多态:简单的讲多态就是:一种方法多种接口。
准确的说:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
从以上概念中我们知道。多态的实现实质是通过方法这一机制来实现的,当然这里所指的方法(主要)是指类中的方法(或叫服务)。同时也说明
类中的数据是不具有多态性的。从这里我们就可以得出一个结论:在面向对象语言里(无任哪种OOPL)都有实现多态的语言机制。并且这些实现
多态的语言机制都是针对方法的。而数据是不具有多态这一性质的
现在让我们看看当今流行的面向对象语言是不是符合这个结论
便于读者理解我所举的例子。先做一些必要的说明。下面一共举了三种比较流行的OOPL的例子。
分别是。java,C++(采用1998的标准),C#(Microsoft 公司的新语言)
基类:一个Person 其中含有两个共公变量。iNo,strName.一个构造涵数,一个显示方法。
子类:继承于基类Person 基中也含中两个共公变量:iNo,strName.一个构造函数,一个显示方法。
同时请读者注意:举这三个例子我只想说明结论:”在面向对象语言里(无任哪种OOPL)都有实现多态的语言机制。并且这些实现
多态的语言机制都是针对方法的。而数据是不具有多态这一性质的“。而不是从设计的合理性出发的。当然也很少有人会这个设计。我这样做的目的
只是为了让例子简单。便于说明问题
// ------------------java 中例子----------------------------
package wfgA001;
class Person
{
public int iNo;
public String strName;
public Person()
{
}
public Person(int no,String name)
{
iNo=no;
strName=name;
System.out.println("class Person");
}
public void Show()
{ // 用于显示的 iNo和strName的值
System.out.println(" class Person iNo:"+iNo+" strName:"+strName);
}
}
class Student extends Person
{
public int iNo;
public String strName;
public Student(int no,String name)
{
super(111,"class person");
System.out.println("class Student");
iNo=no;
strName=name;
}
// 用于显示的 iNo和strName的值
public void Show()
{
System.out.println(" class Student iNo:"+iNo+" strName:"+strName);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("--------------------intance of class Person: obj------------------------");
Person obj=new Person(2,"weng");
System.out.println(" obj.iNo:"+obj.iNo+" obj.strName:"+obj.strName);
obj.Show();
System.out.println("--------------------------intance of class student:obj2 ---------------------");
Person obj2=new Student(5,"weng fu guo");
System.out.println(" obj2.iNo:"+obj2.iNo+" obj2.strName:"+obj2.strName);
obj2.Show();
}
}
//在java中的结果
/*
--------------------intance of class Person: obj------------------------
class Person
obj.iNo:2 obj.strName:weng
class Person iNo:2 strName:weng
--------------------------intance of class student:obj2 ---------------------
class Person
class Student
obj2.iNo:111 obj2.strName:class person
class Student iNo:5 strName:weng fu guo
Press any key to continue
*/
//---------------------- c++ 中的例子----------------------------
#include<iostream>
#include<string>
using namespace std;
namespace wfgA002
{
class Person
{
public:
int iNo;
string strName;
public:
Person(int no,string name)
{
cout<<"class Person"<<endl;
iNo=no;
strName=name;
}
public:
virtual void Show()
{
cout<<" class Person iNo:"<<iNo<<" strName:"<<strName<<endl;
}//end functin Show()
};// end class Person
class Student:public Person
{
public:
int iNo;
string strName;
public:
Student(int no,string name):Person(111,"class Person")
{
cout<<" class Student"<<endl;
iNo=no;
strName=name;
}
public:
void Show()
{
cout<<" class Student iNo:"<<iNo<<" strName:"<<strName<<endl;
}
};
}// end namespace wfgA002
using namespace wfgA002;
//主涵数
void main()
{
Person *obj,*obj2;
cout<<"-------------------instance of class Person:obj-----------------------"<<endl;
obj=new Person(2,"weng");
cout<<" obj->iNo:"<<obj->iNo<<" obj->strName:"<<obj->strName<<endl;
obj->Show();
cout<<"------------------instance of class Student:obj2----------------------"<<endl;
obj2=new Student(5,"weng fu guo");
cout<<" obj2->iNo:"<<obj2->iNo<<" obj2->strName:"<<obj2->strName<<endl;
obj2->Show();
}
/*
-------------------instance of class Person:obj-----------------------
class Person
obj->iNo:2 obj->strName:weng
class Person iNo:2 strName:weng
------------------instance of class Student:obj2----------------------
class Person
class Student
obj2->iNo:111 obj2->strName:class Person
class Student iNo:5 strName:weng fu guo
*/
// ---------------------C# 中的例子---------------------------
using System;
namespace wfgA003
{
// 基类Person
class Person
{ public int iNo;
public string strName;
public Person(int no,string name)
{
System.Console.WriteLine("class Person");
iNo=no;
strName=name;
}
public virtual void Show()
{
System.Console.WriteLine(" class Person iNo:{0} strName:{1}",iNo,strName);
}
}
//子类Student
class Student:Person
{
new public int iNo;
new public string strName;
public Student(int no,string name):base(111,"class Person")
{
System.Console.WriteLine("class Student");
iNo=no;
strName=name;
}
public override void Show()
{
// 显示iNo和strName的值
System.Console.WriteLine(" class Student iNo:{0} strName:{1}",iNo,strName);
}
}
class Class1
{
// 主涵数
static void Main(string[] args)
{
System.Console.WriteLine("--------------------instance of class Person------------------------");
Person obj=new Person(2,"weng");
System.Console.WriteLine(" obj.iNo:{0} obj.strName:{1}",obj.iNo,obj.strName );
obj.Show();
System.Console.WriteLine("------------------------instance of class Student--------------------");
Person obj2=new Student(5,"weng fu guo");
System.Console.WriteLine(" obj2.iNo:{0} obj2.strName:{1}",obj2.iNo,obj2.strName);
obj2.Show();
}
}
}
/*
C#中的结果
--------------------instance of class Person------------------------
class Person
obj.iNo:2 obj.strName:weng
class Person iNo:2 strName:weng
------------------------instance of class Student--------------------
class Person
class Student
obj2.iNo:111 obj2.strName:class Person
class Student iNo:5 strName:weng fu guo
*/
从以上这三种语言的例子中。我想足以说明结论。
借以上例子在此我还是想强调一下。无任是哪种OOPL都是具有相同核心的OOP思想只是实现不同而以。
所以说对于我们来说最重要的是彻底搞懂OOP思想。如果面向对象思想理解的很透彻了。那么无任学习
哪种OOPL都不再是难事了。这样我们在实践中采用那种OOPL都没有关系。只要学习一下相应的类库加上看一本OOPL语法书
因为有面向对象思想的前提,所以对于学习语法将变的很容易了。
也就能很快运用于实践中去了。