日期:2008-6-15
學習內容:接口,程序的運行過程
遺留問題:
學習總結:
接口與抽象類:
1. 類是對對象的抽象,可以把抽象類理解爲把類當作對象,抽象成的類。接口只是一個行爲的規範或規定。接口表述的是“我能做”(Can-do),抽象類更多的是定義在一系列緊密相關的類間(IS-a),而接口大多數是關係疏鬆但都實現某一功能的類中
2. 接口基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法;
3. 一個類一次可以實現若干個接口,但是隻能擴展一個父類。
4. 抽象類實現了OOP中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義爲不可變的,而把可變的由子類去實現。
5. 好的接口定義應該是具有專一功能性啊,而不是多功能的,否則造成接口污染。如果一個類只是實現了這個接口中的一個功能,而不得不去實現接口中的其他方法,就叫接口污染。
6. 如果抽象類實現接口,則可以把接口中方法映射到抽象類中作爲抽象方法而不必實現,而在抽象類的子類中實現接口中的方法。
接口與抽象類:
1. 抽象類用於部分實現一個類,再由用戶按需求對其進行不同的擴展和完善;接口只是定義一個行爲的規範或規定。
2. 抽象類在組件的所有實現間提供通用的已實現功能;接口創建在大範圍全異對象間使用的功能。
3. 抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。
4. 抽象類主要用於設計大的功能單元;而接口用於設計小而簡練的功能塊。
模擬場景:教師考取駕駛執照,那麼他屬於教師類還是司機類呢?
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
interface IDrivingLicenceB
{
void getLicence();
}
interface IDrivingLicenceA:IDrivingLicenceB
{
new void getLicence();
}
class Teacher : IDrivingLicenceA
{
public void getLicence()
{
Console.WriteLine("老師考取了A類駕駛執照");
}
}
class Student : IDrivingLicenceB
{
public void getLicence()
{
Console.WriteLine("學生考取了B類駕駛執照");
}
}
class Program
{
static void DriveCar(string name, object o)
{
IDrivingLicenceB dl = o as IDrivingLicenceB;
if (dl != null)
{
Console.WriteLine(name + "開動了卡車");
}
else
{
Console.WriteLine(name + "不能開卡車");
}
}
static void DriveBus(string name, object o)
{
IDrivingLicenceA dl = o as IDrivingLicenceA;
if (dl != null)
{
Console.WriteLine(name + "開動了公共汽車");
}
else
{
Console.WriteLine(name+"不能開公共汽車");
}
}
static void Main (string[] args)
{
Teacher t = new Teacher();
DriveCar("教師", t);
DriveBus("教師", t);
Student s = new Student();
DriveCar("學生", s);
DriveBus("學生", s);
}
}
}
程序功能:實現IComparable接口,來實現排序
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication2
{
class Student:IComparable//實現系統自帶的IComparable接口
{
private string name;
private int age;
public Student(string name, int age)
{
this.name = name;
this.age = age;
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
public int CompareTo(object right)
{
if (!(right is Student))
throw new ArgumentException("參數類型必須爲student類型");
return name.CompareTo(((Student)right).name);
}
public override string ToString()//如果不重寫此方法將返回的是類型
{
return name;
}
}
class Program
{
static void Main (string[] args)
{
Student[] arr =new Student[5];
arr[0] = new Student("張三", 5);
arr[1] = new Student("李四", 3);
arr[2] = new Student("王五", 4);
arr[3] = new Student("趙六", 2);
arr[4] = new Student("錢七", 1);
Array.Sort(arr);//調用Array類的靜態方法Sort
foreach (Student i in arr)
Console.WriteLine(i);
}
}
}
.NET Framework (代碼庫、通用類型系統CTS、CLR)
編譯
C#————>程序集(.exe、.dll[MSIL])、元信息[數據信息]、可選資源[圖片、聲音])
| |
| (Microsoft Intermediate Language 微軟中間語言)
|
| JIT編譯 (Just-In-Time 僅在需要時才編譯MSIL)
|
——> 機器代碼 <———— .NET CLR (Common Language Runtime 公共語言運行庫)
運行 / \
/ \
託管 非託管
(C#) (C++)
總結:
一、用C#等.NET兼容語言編寫代碼
編譯
二、 C#————>程序集
JIT編譯
三、 程序集—————>機器代碼
運行
四、 託管CLR————>機器代碼