C#中的繼承

來源:互聯網
上載者:User

本文轉自:http://hi.baidu.com/kaixinpengpeng/blog/item/9f6911d834b8b93633fa1c88.html
第5章C#中的繼承

一、繼承

什麼是繼承:繼承是允許重用現有類去建立新類的過程。分類的原則是一個類派生出來的子類具有這個類的所有非私人的屬性。
1、繼承C#中的類:C#不支援多重繼承,C#類始終繼承自一個基類(如果未在聲明中指定一個基類,則繼承自System.Object)。
衍生類別繼承基類的文法如下:
using System;
public class Person
{
//這是基類
}
public class Student:Person
{
//這是衍生類別
}
註:衍生類別繼承基類時用“:”符號串連,衍生類別繼承基類的所有非私人成員變數和方法。
2、調用基類的建構函式:
如果對類沒有定義顯式建構函式,則編譯器將提供預設的建構函式,以初始化這些類的成員欄位。但是,如果顯式添加了建構函式,就可以有效控制整個構造過程。
樣本:
using System;
namespace Jicheng
{
//基類
public class Person
{
public string  _name;
public uint  _age;
//基類的建構函式
public Person(string name,uint age)
{
this._name = name;
this._age = age;
  //列印輸出
Console.WriteLine(_name);
Console.WriteLine(_age);
}
}
//衍生類別
public class Student:Person
{
private uint _id;
//衍生類別建構函式並調用基類建構函式用“:base”
public Student(string name,uint age uint id):base(name,age)
{
this._id = id;

//列印輸出
Console.WriteLine(_id);
}
}
public class Exercise
{
[STAThread]
static void Main(string[] args)
{
//構造 Student
Student objstudent=new Student(“XYZ”,45,001);
}
}
}
註:衍生類別通過使用:base()文法可以顯式調用基類的建構函式。在必要的情況下,可以利用它來初始化欄位。

二、C#中的方法重寫
關鍵字:override
override關鍵字用語修改方法,具有override關鍵字修飾符的方法是對基類中同名方法的新實現,基類中的同名方法必須聲明為virtual或abstract類型。給基類中的方法添加virtual關鍵字表示可以在衍生類別中重寫它的實現。
1、預設的C#方法並非virtual,因此不能重寫。
2、基類方法的可存取層級並不因重寫它的方法而改變,他們的存取修飾詞相同。
3、new、static和virtual關鍵字不能與override存取修飾詞一同使用
關鍵字:virtual
C#中提供virtual關鍵字,用語將方法定義為支援多太,用於對一個類中可修改的方法的聲明,這種方法稱為虛擬方法,字類可以使用override關鍵字自由實現它們各自版本的虛擬方法
文法:
[存取修飾詞] virtual [傳回值類型] 方法名稱([參數列表])
{
  //虛擬方法的實現
}
1、virtual存取修飾詞不能與static和override等存取修飾詞一同使用
2、調用虛擬方法,在運行時系統會自動檢查,以確定調調用了哪一個實現方法。
關鍵字:new
new存取修飾詞用於顯式隱藏繼承自基類的成員,如果衍生類別成員與基類成員名稱相同,new會將衍生類別成員識別為一個全新成員。
1、在一個方法中同時使用new和override將會出錯。
2、new存取修飾詞的真正目的是為了隱藏基類方法。
3、如果將一個方法生命為new,它實際上並沒有隱藏基類方法,並且編譯器也產生了警告,這時應該刪除new。

三、抽象類別和抽象方法
什麼是抽象類別:不能被執行個體化的類稱為抽象類別,抽象類別是衍生類別的基類。
關鍵字:abstract
文法:
abstract class 類名
{
…………
}
1、一個抽象類別可以同時包含抽象方法和非抽象方法。
2、抽象方法只在衍生類別中真正實現,這表明抽象方法只存放函數原型,不涉及主體代碼,
3、派生自抽象類別的類需要實現其基類的抽象方法,才能執行個體化對象。
4、使用override關鍵子可在衍生類別中實現抽象方法,經override聲明重寫的方法稱為重寫基類方法,其簽名必須與override方法的簽名相同。
樣本:
using System;
namespace Example_5
{
//抽象類別
abstract class ABC
{
  //抽象方法
  public abstract void Afunc();
}
//衍生類別
class Derv:ABC
{
  //實現抽象類別中的抽象方法
  public override void Afunc()
{
  Console.WriteLine(“實現抽象方法”);
  }
}
public class Test
{
  static void Main(string[] args)
  {
   Derv obj=new Derv();
   obj.Afunc();
  }
}
}
5、基類實現抽象類別,則衍生類別不需要重新實現該抽象類別。
6、抽象類別並不僅僅只是一種實現技巧,它更代表一種抽象的概念,從而為所有的衍生類別確立一種約定。

四、介面
關鍵字:interface
文法:
修飾符 interface 介面名
{
  //介面主體
}
1、一個介面就相當於一個抽象類別,但是它不能半喊任何實現方法。
2、介面的每種方法都必須在衍生類別中實現。
3、介面有時候可以看成是類的模具,它指明一個類該提供哪些內容。
4、介面主體只限於方法、索引器、屬性的聲明。
5、介面中不能包含欄位、建構函式和常量等。
6、介面成員是隱式公開的,如果對其顯式指定存取層級,就會出現編譯器錯誤。
7、在介面中不能實現任何方法,屬性或者索引器。
8、在指定方法時,只需給出傳回型別、名稱和參數列表,然後以分號結束。
9、實現介面的文法與實現繼承一樣,都用冒號“:”
樣本
interface Icustomer
{
………………
}
public class MyClass: Icustomer
{
………………
}
10、介面中的方法不能重寫,只能實現。
11、
編碼通訊協定:
介面名稱需始終冠以大寫字母I

五、多重介面實現
C#中多重介面的實現,彌補了C#只能單一繼承,不能多重繼承弱點。
文法樣本:
public intetface IName
{
       void Name();
}
public interface IAge
{
void Age();
}
public class Consoleshow: IAge, IName
{
public void Name()
{
//具體實現
}
public void Age()
{
//具體實現
}
}

六、明確介面實作
如果兩個介面中有完全相同的簽名,那麼可以用“介面名.方法名”的方法顯式的來實現介面。
樣本:
public interface Iname
{
void Test();
}
public interface Iage
{
void Test();
}
public Test: Iname, Iage
{
void Iname Test()
{
// Iname借口的實現
}
void Iage Test()
{
// Iage借口的實現
}

}

七、介面繼承
通過合并其他介面,也可以建立介面。用於合并介面的文法於繼承的文法非常相似,只是前者可以將多個介面合并成一個。一個類要實現一個介面,必須為基底介面和派生借口的所有成員編寫代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.