作者: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語法書
因爲有面向對象思想的前提,所以對於學習語法將變的很容易了。
也就能很快運用於實踐中去了。