from:(http://hi.baidu.com/21tian/blog/item/aabfae6ed4a675de81cb4ab4.html)
interface用來聲明介面
1.只提供方法的規則約束,不提供方法的主體。
例:
public interface IPerson
{
void getName();//不包含主體方法
}
2.方法不能用public abstract等修飾,無欄位變數,無建構函式。
3.方法可包含參數
如
public interface IPerson
{
void getAge(string s);
}
例1
public interface IPerson
{
IPerson();//錯誤
string name;//錯誤
public void getIDcard();//錯誤
void getName();//正確
void getAge(string s);//正確
}
實現interface的類
1.與繼承類的格式一致,如 public class Chinese:IPerson{}
2.必須實現interface中的各個方法
例2,繼承例1
public class Chinese:IPerson
{
public Chinese(){}//添加建構函式
public void getName(){}//實現getName()
public void getAge(){}//實現getAge()
}
abstract用來聲明抽象類別、抽象方法
1.抽象方法所在類必須為抽象類別。
2.抽象類別不能直接執行個體化,必須由其衍生類別實現。
3.抽象方法不包含方法主體,必須由衍生類別以override方式實現此方法,這點跟interface中的方法類似
如
public abstract class Book
{
public Book()
{
}
public abstract void getPrice(); //抽象方法,不含主體
public virtual void getName() //虛方法,可覆蓋
{
Console.WriteLine("this is a test:virtual getName()");
}
public virtual void getContent() //虛方法,可覆蓋
{
Console.WriteLine("this is a test:virtual getContent()");
}
public void getDate() //一般方法,若在衍生類別中重寫,須使用new關鍵字
{
Console.WriteLine("this is a test: void getDate()");
}
}
public class JavaBook:Book
{
public override void getPrice() //實現抽象方法,必須實現
{
Console.WriteLine("this is a test:JavaBook override abstract getPrice()");
}
public override void getName() //覆蓋原方法,不是必須的
{
Console.WriteLine("this is a test:JavaBook override virtual getName()");
}
}
測試如下:
public class test
{
public test()
{
JavaBook jbook=new JavaBook();
jbook.getPrice(); //將調用JavaBook中getPrice()
jbook.getName(); //將調用JavaBook中getName()
jbook.getContent(); //將調用Book中getContent()
jbook.getDate(); //將調用Book中getDate()
}
public static void Main()
{test t=new test();
}
}
virtual標記方法為虛方法
1.可在衍生類別中以override覆蓋此方法
2.不覆蓋也可由對象調用
3.無此標記的方法(也無其他標記),重寫時需用new隱藏原方法
abstract與virtual: 方法重寫時都使用 override 關鍵字
interface中的方法和abstract方法都要求實現
overrid和new
//override不能重寫非虛方法或靜態方法。
//所重寫的基方法必須是虛擬、抽象的或重寫的。
//所以說虛(virtual)成員與重寫(override)成員是配對使用的,
//雖然也可以用new來"隱藏"虛成員
//下面通過例子來看看重寫與隱藏的區別,從而進一步理解虛成員的作用。
//重寫部分----------
public class MyBaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base imp");
}
}
public class MyDerivedClass:MyBaseClass
{
public override void DoSomething()
(
Console.WriteLine("Derived imp");
}
}
//其中重寫方法將替換基類中的執行代碼,這樣下面的代碼就將使用替換代碼,
//即使這是通過基類進行的,情況也是這樣:
MyDerivedClass myObj=new MyDerivedClass();
MyBaseClass myBaseObj;
myBaseObj=myObj;
myBaseObj.DoSomething();
//結果如下:
Derived imp
//另外,還可以使用下面的程式碼後置基類方法:
public class MyBaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base imp");
}
}
public class MyDerivedClass:MyBaseClass
{
new public void DoSomething()
{
Console.WriteLine("Derived imp");
}
}
//基類方法不必是虛擬,但結果是一樣的,上面的代碼只需要修改行。
//對於基類的虛擬方法和非虛擬方法來說,其結果如下:
Base imp
//儘管隱藏了基類的執行代碼,但仍可以通過基類訪問它。
(4) 使用 new 修飾符隱藏基類成員
使用 new 修飾符可以顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在衍生類別中聲明該成員,並用 new 修飾符修飾它。
請看下面的類:
public class MyBase
{
public int x ;
public void MyVoke() ;
}
在衍生類別中用 MyVoke名稱聲明成員會隱藏基類中的 MyVoke方法,即:
public class MyDerived : MyBase
{ new public void MyVoke (); }
但是,因為欄位 x 不是通過類似名隱藏的,所以不會影響該欄位。
通過繼承隱藏名稱採用下列形式之一:
a、引入類或結構中的常數、指定、屬性或類型隱藏具有相同名稱的所有基類成員。
b、引入類或結構中的方法隱藏基類中具有相同名稱的屬性、欄位和類型。同時也隱藏具有相同簽名的所有基類方法。
c、引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。
注意:在同一成員上同時使用 new 和 override 是錯誤的。同時使用 new 和 virtual 可保證一個新的專用化點。在不隱藏繼承成員的聲明中使用 new 修飾符將發出警告。
樣本1:在該例中,基類 MyBaseC 和衍生類別 MyDerivedC 使用相同的欄位名 x,從而隱藏了繼承欄位的值。該例說明了 new 修飾符的使用。同時也說明了如何使用完全限定名訪問基類的隱藏成員。
using System ;
public class MyBase
{
public static int x = 55 ;
public static int y = 22 ;
}
public class MyDerived : MyBase
{
new public static int x = 100; // 利用new 隱藏基類的x
public static void Main()
{
// 列印x:
Console.WriteLine(x);
//訪問隱藏基類的 x:
Console.WriteLine(MyBase.x);
//列印不隱藏的y:
Console.WriteLine(y);
}
}
輸出: 100 55 22
如果移除 new 修飾符,程式將繼續編譯和運行,但您會收到以下警告:
The keyword new is required on ''MyDerivedC.x'' because it hides inherited member ''MyBaseC.x''.
如果巢狀型別正在隱藏另一種類型,如下例所示,也可以使用 new 修飾符修改此巢狀型別。