標籤:
上一篇 講了 Java 物件導向抽象類別的使用。這次我們來學習 C#物件導向抽象類別的使用。其實方法理論掌握了,語言只是工具。閑話少說。下面是上一篇的需求
抽象類別大家都知道,但是具體有什麼用,為什麼要用到抽象類別。大家肯定有人不太明白。培訓中心老師怎麼教就怎麼用。最近閑來無事。研究起物件導向理論。下面讓我用一個例子來說明一下。物件導向抽象類別的使用方法。只是起到一個入門和拋磚引玉的作用。(理論和語言無關)
定義和概念:
在物件導向的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的資訊來描繪一個具體的對象,這樣的類就是抽象類別。
下面我們具體看看抽象類別的真面目。
修飾符 abstract class 類名 同樣也適用c#
上面描述的就是抽象類別。
抽象類別往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如,在一個圖形編輯軟體的分析設計過程中,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域並不是直接存在的,它就是一個抽象概念。而正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類別是不能夠執行個體化的。不能執行個體化那具體該怎麼用呢。下面以一個簡單的例子說明。 學生王小明去上海學習C#這是需求 通過上面的內容我們知道物件導向的主體是學生(物件導向開發主要就是在需求中找到對象)方法是學習 方法實現的功能是(學生+name(王小明)+"去"+address(上海)+"學習C#")自學離不開例子,一定要找那些簡單的,而且英文單詞也簡單的例子來進行學習(因為主要是掌握物件導向的理論,而不是學習英語)閑言少說,開始編寫代碼。 至於用到的工具,及工具的使用,在此不做介紹,百度一下全有了。我想看這個文章的童鞋們已經熟練使用開發工具了。通過主體分析是學生。第一眼看到學生會想到什麼 人 對 我們先定義一個人的抽象類別Java 代碼public abstract class Person {
String name="";//即然是人肯定是要有名字的。
int age=0;//年齡
Person(String name,int age){
this.name=name;
this.age=age;
}
abstract void Study();
} public class Student extends Person {
String address="";//多增加一個屬性地址
Student(String name,int age,String address){
super(name,age);//如果此句不明白,請查百度。太基礎的東西不講。
this.address=address;
}
@Override
void Study(){//實現的抽象方法
System.out.print("學生"+name+" 要去"+address+"學習Java");
}
}
C# 代碼 就當我們不懂C# 那我們就照葫蘆畫瓢 便於區分 C#代碼我們用藍色public abstract class Person { String name="";//即然是人肯定是要有名字的。
int age=0;//年齡
Person(String name,int age){
this.name=name;
this.age=age;
}
abstract void Study();
} public class Student extends Person {
String address="";//多增加一個屬性地址
Student(String name,int age,String address){
super(name,age);//如果此句不明白,請查百度。太基礎的東西不講。
this.address=address;
}
@Override
void Study(){//實現的抽象方法
System.out.print("學生"+name+" 要去"+address+"學習Java");
}
}
如果你這麼寫,編繹肯定出錯。不一樣的地方我改成紅色代碼
出錯不怕。有萬能的百度或是我們手裡賣一本C#文法的書。查一下C#繼承的文法是什麼。題外話(只要掌握方法理論。語言只是一個工具。不會我們可以查手冊。但是方法理論是共通的)
通過查詢文法知道繼承是這個樣子的。
public class Student:Person extends 換成了:這個符號
第一個紅色的問題我們解決了。在解決第二個紅色的問題
super(name,age);
我們在查一下百度 Java super 在C#中如何表示 萬能的百度
查詢發現是這個樣子 :base(name,age)
好我們照著寫出來
public Student(string name,int age,string address)
{
:base(name,age)
this.address= address;
}
可以負責的告訴你 你要是編繹一下,會出現語法錯誤。怎麼辦。其實開發人員多數時間寫代碼是調試和測試。這就是經驗。下回在遇到同一問題可以快速解決。或是避免此問題的發生。
因為 :base(name,age) 放的位置不對正確的代碼如下
public Student(string name, int age, string address)
: base(name, age)
{
this.address= address;
}
在編繹一下你會發現還是不對,呵呵。這就是一個最基礎的問題。Java的變數定義預設為 public、C#的變數定義預設為private
我們上一次的Java代碼寫得不規範。導致我們這次的錯誤發生。將上一次的代碼更改一下如下
public abstract class Person {
public String name="";
public int age=0;
Person(String name,int age){
this.name=name;
this.age=age;
}
abstract void Study();
}
下面我們在將C#正確代碼寫出來
public abstract class Person
{
public string name = string.Empty;
public int age = 0;
public Person(string name,int age)
{
this.name = name;
this.age = age;
}
public abstract void Studey();
}
public class Student:Person
{
string address = string.Empty;//Java中字串預設值為空白 "" c#中有此方法寫義 string.Empty 空有二種方式 "" null 這個方法全搞定。不明白具體查百度
public Student(string name, int age, string address)
: base(name, age)
{
this.address= address;
}
public override void Studey()
{
Console.Write(name + " 要去" + address + "學習"); //表單列印字串 查一下百度就可以知道
}
}
下面我們也寫一個測試類別,測試一下。
Program.cs main 方法寫在這裡面。記住就可以。不明白查百度。
Person per = new Student("王小明", 38, "上海");
per.Studey();
編繹一下
------ 已啟動產生: 項目: AbstractDemo, 配置: Debug Any CPU ------
AbstractDemo -> C:\Documents and Settings\lanzhi.SHENYANG\My Documents\Visual Studio 2008\Projects\AbstractDemo\AbstractDemo\bin\Debug\AbstractDemo.exe
========== 產生: 成功或最新 1 個,失敗 0 個,跳過 0 個 ==========
機器不同。產生的編繹資訊也不一樣。總之看最後一句話,紅色的。說明編繹通過了。我們運行一下。
學生王小明去上海學習C# 但是發現一個問題 螢幕一閃而過,呵呵沒有看清楚,怎麼辦。查一下百度吧。查詢也是學習的過程。我建議大家查MSDN 這個的好處。不用我多說,到時你們就會知道。就像大家不會的字查字典一樣。
查詢發現
Console.ReadKey();//擷取使用者按下的下一個字元或功能鍵。 按下的鍵顯示在控制台視窗中。
還有一種查詢方法,就是 Console 點一下 後面有一堆的方法,中文的解釋全有。
我把修改後的代碼貼上
public class Student:Person
{
string address = string.Empty;
public Student(string name, int age, string address)
: base(name, age)
{
this.address= address;
}
public override void Studey()
{
Console.Write(name + " 要去" + address + "學習");
Console.ReadKey();//擷取使用者按下的下一個字元或功能鍵。 按下的鍵顯示在控制台視窗中。
}
這時我們在運行一下
發現螢幕上顯示
學生王小明去上海學習C# 這時螢幕不閃了也不消失了。如果關掉此表單呢。很簡單按下任意鍵,表單關閉了。
之前那個舉一返三的程式員類我想大家也知道如何在C#中寫了吧
代碼如下:
class Programmer:Person
{
string address = string.Empty;
string child = string.Empty;
public Programmer(string name, int age, string address, string child)
: base(name, age)
{
this.address = address;
this.child = child;
}
public override void Studey()
{
Console.Write(name + "帶著孩子" + child + " 要去" + address + "進行C#架構師的學習");
Console.ReadKey();
}
}
class Program
{
static void Main(string[] args)
{
// Person per = new Student("王小明", 38, "上海");
//per.Studey();
Person per = new Programmer("張小明", 38, "上海", "張小小明");
per.Studey();
}
}
是不是感覺抽象類別很有用,假如不單有學生,程式猿,還有工人、明星、記者等,只需在這個抽象類別的基礎上增加相應的同能,而且同時可以防止駭客去直接存取抽象類別,因為抽象類別不可以產生對象。還能防止因為自己的馬虎造成遺漏代碼。
學會用抽象的物件導向思想解決問題,是作為程式員一個良好的習慣。
聲明如下:
因為本人有很多的工作要做。寫這個主要是利用業餘時間。難免代碼有錯誤的地方。或文字上有錯別字。還是這句話,寫這些主要是教大家如何學習。理論掌握了,語言只是工具。謝謝大家在百忙之中觀看此文。
c# 物件導向抽象類別的使用