C#語法學習抽像類(abstract)

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 11:04
 * 抽像類(abstract)
 * abstract修飾符可以和類,方法,屬性,索引器及事件一起使用.
 * 在類聲明中使用abstract修飾符以指示某個類只能是其他類的基類.
 * 標記為抽像或包含在抽像類中的成員必須通過從抽像類派生的類來實現.
 * 
 * 抽像類的特性
 * 1,抽像類不能實例化.
 * 2,抽像類可以包含抽像方法和抽像訪問器.
 * 3,不能用sealed修飾符修改抽像類,這意味著抽像類不能被繼承.sealed是防止被繼承才用的.
 * 4,從抽像類派生的非抽像類必須包括繼承的所有抽像方法和抽像訪問器的實現.
 * 
 * 
 
*/
using  System;
abstract   class  A
{
    
}
class  B:A
{
    
}
class  Test
{
    
static   void  Main()
    {
        
// A a=new A();出錯,無法建立抽像類別或是介面A的執行個體
        B b = new  B(); // 這次正常運行,換句話說一個抽像類只能做為別一個類的基類
    }
}
 
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 11:17
 * 抽像方法,在此處只能聲明,不能實現,必需在其子類中實現
 * 抽像方法必需是聲明在抽像類中
 * 抽像方法必需是public類型的
 * 
 * 
 * 其子類在實現抽像類的方法,屬性,索引器和事件時
 * 如果子類也是抽像類的話可以不用實現
 * 反過來如果子類不是抽像類的話就必需去實現
 * 
 * 抽像方法的特點
 * 1,抽像方法是隱式的虛方法.
 * 2,只允許在抽像類中使用抽像方法聲明.
 * 3,因為抽像方法聲明不提供實際的實現,所以沒有方法;
 * 方法聲明只是以一個分號結束,並且在簽名後沒有大括號({})
 * 實現由一個重寫方法提供,此重寫方法是非抽像像的成員.
 * 4,在抽像方法聲明中使用static或是virtual修飾符是錯誤的.
 * 5,除了在聲明和調用語法上不同外,抽像屬性的行與抽像方法一樣.
 * 6,在靜態屬性上使用abstract修飾符是錯誤的.
 * 7,在派生類中,通過包括使用override修飾符的屬性聲明,可以重寫抽像的繼承屬性.
 *
 * 
 
*/
using  System;
abstract   class  A
{
    
protected   int  _x;
    
public   abstract   void  F();
    
public   abstract   int  X
    {
        
get ;
        
set ;
    }
}
class  B:A
{
    
public   override   void  F()
    {
        
    }
    
public   override   int  X
    {
        
get return  _x; }
        
set { _x = value; }
    }
    
}
class  Test
{
    
static   void  Main()
    {
        B b
= new  B();
        b.X
= 10 ;
        Console.WriteLine(b.X);
    }
}
 
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/3
 * Time: 上午 11:38
 * 抽像類的構造函數
 * 任何情況下,抽像類都不應進行實例化,因此,正確定議其構造函數就非常重要.
 * 確保抽像類功能的正確性和擴展性也很重要.下列準則有助於確保抽像類能夠
 * 正確地設計在實現後可以按預期方式工作.
 * 1,不要在抽像類型中定議公共的或是受保護的內部構造函數,有public或
 * protected internal可見性的構造函數用於能進行實例化的類型.任何情況
 * 下抽像類型都不能實例化.
 * 2,應在抽像類中定議一個受保護(protected)構造函數或內部(private)構造函數.
 * 3,如果在抽像類中定議一個受保護構造函數,則在創建子類的實例時,基類可執行
 * 初始化任務.
 * 
 * 下面的例子是用抽像類改造的虛方法中的一個例子,同樣也實現了多態的方法.
 * 並且在子類中初始化了基類的構造函數
 * 
 * 抽像和虛方法都實現了多態的機制,那麼情況下應該怎麼使用這兩者:
 * 1,在所有的子類都要實現一些共同的功能時候,這個時候比較常用虛方法.
 * 因為我們可以把這些共同的功能包裝到基類的方法中,在子類中使用base來讞用.
 * 2,如果子類的方法各不相干,他們沒有共同的功能時,這個時候比較常用抽像類.
 * 
 * 抽像方法和虛方法的區別
 * 1,抽像方法和虛方法的區別在於:虛方法有一個實現部份,並為子類提供了覆蓋該方法的選項,相反,抽像方法沒有提供實現部份,強制子類覆蓋該方法(否則子類不能成為具體類)
 * 2,abstract方法只能在抽像類中聲明,虛方法則不是.
 * 3,abstract方法必須在子類中重寫,而virtual則不必.
 * 4,abstract方法不能聲明方法實体,虛方法則可以.
 * 5,包含abstract方法的類不能被實例化,而包含virtual的類則可以.
 * 
 
*/

using  System;
abstract   class  Employee
{
    
protected   string  _name;
    
protected  Employee(){}
    
protected  Employee( string  name)
    {
        
this ._name = name;
    }
    
public   abstract   void  StartWork();
}
class  Manager : Employee
{
    
public  Manager( string  name): base (name){}
    
public   override   void  StartWork()
    {
        Console.WriteLine(_name 
+   " 給員工下達任務 " );
    }
}
class  Secretary : Employee
{
    
public  Secretary( string  name): base (name){}
    
public   override   void  StartWork()
    {
        Console.WriteLine(_name 
+   " 協助經理 " );
    }
}

class  Seller : Employee
{
    
public  Seller( string  name): base (name){}
    
public   override   void  StartWork()
    {
        Console.WriteLine(_name 
+   " 銷售產品 " );
    }
}
// 新增員工時只需要再新增一個類繼承自Employee
class  Accountant : Employee
{
    
public  Accountant( string  name): base (name){}
    
public   override   void  StartWork()
    {
        Console.WriteLine(_name 
+   " 管理公司財政 " );
    }
}
class  Test
{
    
static   void  Main()
    {
        Employee[] emp
= new  Employee[ 5 ];
        emp[
0 ] = new  Manager( " 經理張三 " );
        emp[
1 ] = new  Secretary( " 助理李四 " );
        emp[
2 ] = new  Seller( " 王五 " );
        emp[
3 ] = new  Seller( " 馬六 " );
        emp[
4 ] = new  Accountant( " 錢七 " );
        Console.WriteLine(
" 早上八點,開始工作. " );
        
foreach (Employee e  in  emp)
        {
            e.StartWork();
        }
    }
}
 

你可能感兴趣的:(abstract)