亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

.net 調(diào)用基類(經(jīng)典文章)

系統(tǒng) 2009 0

在VS.NET中調(diào)用基類的辦法

1.創(chuàng)建一個類:Class1.cs

通過base 關(guān)鍵字訪問基類的成員:

   調(diào)用基類上已被其他方法重寫的方法。
   指定創(chuàng)建派生類實(shí)例時應(yīng)調(diào)用的基類構(gòu)造函數(shù)。
   基類訪問只能在構(gòu)造函數(shù)、實(shí)例方法或?qū)嵗龑傩栽L問器中進(jìn)行。
   從靜態(tài)方法中使用 base 關(guān)鍵字是錯誤的。

  示例:下面程序中基類 Person 和派生類 Employee 都有一個名為 GetInfo 的方法。通過使用 base 關(guān)鍵字,可以從派生類中調(diào)用基類上的 Getinfo 方法。

源文件如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;//MessageBox.Show()

namespace FileAddAndRemove
{
class Class1
{
}
public class Person
{
public string CompanyID = "1111-2222-3333";
public string CompanyName = "BGIF";

public virtual void GetInfo()
{

MessageBox.Show("CompanyName:"+CompanyName+"CompanyID:"+CompanyID);

//如果不想彈出2個對話框,可以把上面語句注釋掉

}
}
class Employee : Person
{
public string _name = "TengShuai";
public string _sex = "男";
public override void GetInfo()

//輸入override后按空格,選擇基類的GetInfo方法,自動生成base.GetInfo(); 從而達(dá)到調(diào)用基類的GetInfo方法
{

base.GetInfo();
System.Windows.Forms.MessageBox.Show("Name:"+ _name+"/n"+"Sex:"+_sex);

}
}
}

2.WinForm中調(diào)用

private void button1_Click(object sender, EventArgs e)
{
Employee _e = new Employee();
_e.GetInfo();

}

測試環(huán)境VS.net2005+Winxpsp2

本文是在學(xué)習(xí)網(wǎng)上的一篇文章時寫的

附:(網(wǎng)上的那篇文章)

內(nèi)容導(dǎo)航

一、繼承基礎(chǔ)知識
二、C#的繼承規(guī)則
三. 訪問與隱藏基類成員
四、多級繼承
五、繼承與訪問修飾符

一. 繼承基礎(chǔ)知識

  為了提高軟件模塊的可復(fù)用性和可擴(kuò)充性,以便提高軟件的開發(fā)效率,我們總是希望能夠利用前人或自己以前的開發(fā)成果,同時又希望在自己的開發(fā)過程中能夠有足夠的靈活性,不拘泥于復(fù)用的模塊。C#這種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語言提供了兩個重要的特性--繼承性inheritance 和多態(tài)性polymorphism。

  繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的主要特征之一,它可以讓您重用代碼,可以節(jié)省程序設(shè)計(jì)的時間。繼承就是在類之間建立一種相交關(guān)系,使得新定義的派生類的實(shí)例可以繼承已有的基類的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次。

  現(xiàn)實(shí)世界中的許多實(shí)體之間不是相互孤立的,它們往往具有共同的特征也存在內(nèi)在的差別。人們可以采用層次結(jié)構(gòu)來描述這些實(shí)體之間的相似之處和不同之處。


圖1 類圖

  上圖反映了交通工具類的派生關(guān)系。最高層的實(shí)體往往具有最一般最普遍的特征,越下層的事物越具體,并且下層包含了上層的特征。它們之間的關(guān)系是基類與派生類之間的關(guān)系。

  為了用軟件語言對現(xiàn)實(shí)世界中的層次結(jié)構(gòu)進(jìn)行模型化,面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)引入了繼承的概念。一個類從另一個類派生出來時,派生類從基類那里繼承特性。派生類也可以作為其它類的基類。從一個基類派生出來的多層類形成了類的層次結(jié)構(gòu)。

  注意:C#中,派生類只能從一個類中繼承。這是因?yàn)椋贑++中,人們在大多數(shù)情況下不需要一個從多個類中派生的類。從多個基類中派生一個類這往往會帶來許多問題,從而抵消了這種靈活性帶來的優(yōu)勢。
C#中,派生類從它的直接基類中繼承成員:方法、域、屬性、事件、索引指示器。除了構(gòu)造函數(shù)和析構(gòu)函數(shù),派生類隱式地繼承了直接基類的所有成員。看下面示例:

using System ;
class Vehicle //定義交通工具(汽車)類
{
protected int wheels ; //公有成員:輪子個數(shù)
protected float weight ; //保護(hù)成員:重量
public Vehicle( ){;}
public Vehicle(int w,float g){
wheels = w ;
weight = g ;
}
public void Speak( ){
Console.WriteLine( "交通工具的輪子個數(shù)是可以變化的! " ) ;
}
} ;
class Car:Vehicle //定義轎車類:從汽車類中繼承
{
int passengers ; //私有成員:乘客數(shù)
public Car(int w , float g , int p) : base(w, g)
{
wheels = w ;
weight = g ;
passengers=p ;
}
}

  Vehicle 作為基類,體現(xiàn)了"汽車"這個實(shí)體具有的公共性質(zhì):汽車都有輪子和重量。Car 類繼承了Vehicle 的這些性質(zhì),并且添加了自身的特性:可以搭載乘客。

二、C#中的繼承符合下列規(guī)則:

  1、繼承是可傳遞的。如果C從B中派生,B又從A中派生,那么C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object 類作為所有類的基類。

  2、派生類應(yīng)當(dāng)是對基類的擴(kuò)展。派生類可以添加新的成員,但不能除去已經(jīng)繼承的成員的定義。

  3、構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承。除此以外的其它成員,不論對它們定義了怎樣的訪問方式,都能被繼承。基類中成員的訪問方式只能決定派生類能否訪問它們。

  4、派生類如果定義了與繼承而來的成員同名的新成員,就可以覆蓋已繼承的成員。但這并不因?yàn)檫@派生類刪除了這些成員,只是不能再訪問這些成員。

  5、類可以定義虛方法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實(shí)現(xiàn)類可以展示出多態(tài)性。

  6、派生類只能從一個類中繼承,可以通過接呂實(shí)現(xiàn)多重繼承。

  下面的代碼是一個子類繼承父類的例子:

using System ;
public class ParentClass
{
public ParentClass( )
{ Console.WriteLine("父類構(gòu)造函數(shù)。"); }
public void print( )
{ Console.WriteLine("I'm a Parent Class。") ; }
}
public class ChildClass : ParentClass
{
public ChildClass( )
{ Console.WriteLine("子類構(gòu)造函數(shù)。") ; }
public static void Main( ) {
ChildClass child = new ChildClass( ) ;
child.print( ) ;
}
}

  程序運(yùn)行輸出:

  父類構(gòu)造函數(shù)。子類構(gòu)造函數(shù)。I'm a Parent Class。

  上面的一個類名為ParentClass, main函數(shù)中用到的類名為ChildClass。要做的是創(chuàng)建一個使用父類ParentClass現(xiàn)有代碼的子類ChildClass。

  1.首先必須說明ParentClass是ChildClass的基類。

  這是通過在ChildClass類中作出如下說明來完成的:"public class ChildClass : ParentClass"。在派生類標(biāo)識符后面,用分號":" 來表明后面的標(biāo)識符是基類。C#僅支持單一繼承。因此,你只能指定一個基類。

  2.ChildClass的功能幾乎等同于ParentClass。

  因此,也可以說ChildClass "就是" ParentClass。在ChildClass 的Main( )方法中,調(diào)用print( ) 方法的結(jié)果,就驗(yàn)證這一點(diǎn)。該子類并沒有自己的print( )方法,它使用了ParentClass中的 print( )方法。在輸出結(jié)果中的第三行可以得到驗(yàn)證。

  3.基類在派生類初始化之前自動進(jìn)行初始化。ParentClass 類的構(gòu)造函數(shù)在ChildClass的構(gòu)造函數(shù)之前執(zhí)行。

三. 訪問與隱藏基類成員

  (1) 訪問基類成員

  通過base 關(guān)鍵字訪問基類的成員:

   調(diào)用基類上已被其他方法重寫的方法。
   指定創(chuàng)建派生類實(shí)例時應(yīng)調(diào)用的基類構(gòu)造函數(shù)。
   基類訪問只能在構(gòu)造函數(shù)、實(shí)例方法或?qū)嵗龑傩栽L問器中進(jìn)行。
   從靜態(tài)方法中使用 base 關(guān)鍵字是錯誤的。

  示例:下面程序中基類 Person 和派生類 Employee 都有一個名為 Getinfo 的方法。通過使用 base 關(guān)鍵字,可以從派生類中調(diào)用基類上的 Getinfo 方法。

using System ;
public class Person
{
protected string ssn = "111-222-333-444" ;
protected string name = "張三" ;
public virtual void GetInfo() {
Console.WriteLine("姓名: {0}", name) ;
Console.WriteLine("編號: {0}", ssn) ;
}
}
class Employee: Person
{
public string id = "ABC567EFG23267" ;
public override void GetInfo() {
// 調(diào)用基類的GetInfo方法:
base.GetInfo();
Console.WriteLine("成員ID: {0}", id) ;
}
}
class TestClass {
public static void Main() {
Employee E = new Employee() ;
E.GetInfo() ;
}
}

  程序運(yùn)行輸出:

   姓名: 張三
   編號: 111-222-333-444
   成員ID: ABC567EFG23267
   示例:派生類同基類進(jìn)行通信。

using System ;
public class Parent
{
string parentString;
public Parent( )
{ Console.WriteLine("Parent Constructor.") ; }
public Parent(string myString) {
parentString = myString;
Console.WriteLine(parentString) ;
}
public void print( )
{ Console.WriteLine("I'm a Parent Class.") ; }
}
public class Child : Parent
{
public Child( ) : base("From Derived")
{ Console.WriteLine("Child Constructor.") ; }
public void print( ) {
base.print( ) ;
Console.WriteLine("I'm a Child Class.") ;
}
public static void Main( ) {
Child child = new Child( ) ;
child.print( ) ;
((Parent)child).print( ) ;
}
}

  程序運(yùn)行輸出:

From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

  說明:

  1.派生類在初始化的過程中可以同基類進(jìn)行通信。

  上面代碼演示了在子類的構(gòu)造函數(shù)定義中是如何實(shí)現(xiàn)同基類通信的。分號":"和關(guān)鍵字base用來調(diào)用帶有相應(yīng)參數(shù)的基類的構(gòu)造函數(shù)。輸出結(jié)果中,第一行表明:基類的構(gòu)造函數(shù)最先被調(diào)用,其實(shí)在參數(shù)是字符串"From Derived"。

  2.有時,對于基類已有定義的方法,打算重新定義自己的實(shí)現(xiàn)。

  Child類可以自己重新定義print( )方法的實(shí)現(xiàn)。Child的print( )方法覆蓋了Parent中的 print 方法。結(jié)果是:除非經(jīng)過特別指明,Parent類中的print方法不會被調(diào)用。

  3.在Child類的 print( ) 方法中,我們特別指明:調(diào)用的是Parent類中的 print( ) 方法。

  方法名前面為"base",一旦使用"base"關(guān)鍵字之后,你就可以訪問基類的具有公有或者保護(hù)權(quán)限的成員。 Child類中的print( )方法的執(zhí)行結(jié)果出現(xiàn)上面的第三行和第四行。

  4.訪問基類成員的另外一種方法是:通過顯式類型轉(zhuǎn)換。

  在Child類的Main( )方法中的最后一條語句就是這么做的。記住:派生類是其基類的特例。這個事實(shí)告訴我們:可以在派生類中進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,使其成為基類的一個實(shí)例。上面代碼的最后一行實(shí)際上執(zhí)行了Parent類中的 print( )方法。

  (2) 隱藏基類成員

  想想看,如果所有的類都可以被繼承,繼承的濫用會帶來什么后果?類的層次結(jié)構(gòu)體系將變得十分龐,大類之間的關(guān)系雜亂無章,對類的理解和使用都會變得十分困難。有時候,我們并不希望自己編寫的類被繼承。另一些時候,有的類已經(jīng)沒有再被繼承的必要。C#提出了一個密封類(sealed class)的概念,幫助開發(fā)人員來解決這一問題。

  密封類在聲明中使用sealed 修飾符,這樣就可以防止該類被其它類繼承。如果試圖將一個密封類作為其它類的基類,C#將提示出錯。理所當(dāng)然,密封類不能同時又是抽象類,因?yàn)槌橄罂偸窍M焕^承的。

  在哪些場合下使用密封類呢?密封類可以阻止其它程序員在無意中繼承該類。而且密封類可以起到運(yùn)行時優(yōu)化的效果。實(shí)際上,密封類中不可能有派生類。如果密封類實(shí)例中存在虛成員函數(shù),該成員函數(shù)可以轉(zhuǎn)化為非虛的,函數(shù)修飾符virtual 不再生效。

  讓我們看下面的例子:

bstract class A
{
public abstract void F( ) ;
}
sealed class B: A
{
public override void F( )
{ // F 的具體實(shí)現(xiàn)代碼 }
}

  如果我們嘗試寫下面的代碼

class C: B{ }

  C#會指出這個錯誤,告訴你B 是一個密封類,不能試圖從B 中派生任何類。

  (3) 密封方法

  我們已經(jīng)知道,使用密封類可以防止對類的繼承。C#還提出了密封方法(sealedmethod) 的概念,以防止在方法所在類的派生類中對該方法的重載。對方法可以使用sealed 修飾符,這時我們稱該方法是一個密封方法。

  不是類的每個成員方法都可以作為密封方法密封方法,必須對基類的虛方法進(jìn)行重載,提供具體的實(shí)現(xiàn)方法。所以,在方法的聲明中,sealed 修飾符總是和override 修飾符同時使用。請看下面的例子代碼:

using System ;
class A
{
public virtual void F( )
{ Console.WriteLine("A.F") ; }
public virtual void G( )
{ Console.WriteLine("A.G") ; }
}
class B: A
{
sealed override public void F( )
{ Console.WriteLine("B.F") ; }
override public void G( )
{ Console.WriteLine("B.G") ; }
}
class C: B
{
override public void G( )
{ Console.WriteLine("C.G") ; }
}

  類B 對基類A 中的兩個虛方法均進(jìn)行了重載,其中F 方法使用了sealed 修飾符,成為一個密封方法。G 方法不是密封方法,所以在B 的派生類C 中,可以重載方法G,但不能重載方法F。

  (4) 使用 new 修飾符隱藏基類成員

  使用 new 修飾符可以顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,并用 new 修飾符修飾它。

  請看下面的類:

public class MyBase
{
public int x ;
public void MyVoke() ;
}

  在派生類中用 MyVoke名稱聲明成員會隱藏基類中的 MyVoke方法,即:

public class MyDerived : MyBase
{ new public void MyVoke (); }

  但是,因?yàn)樽侄?x 不是通過類似名隱藏的,所以不會影響該字段。

  通過繼承隱藏名稱采用下列形式之一:

   a、引入類或結(jié)構(gòu)中的常數(shù)、指定、屬性或類型隱藏具有相同名稱的所有基類成員。

   b、引入類或結(jié)構(gòu)中的方法隱藏基類中具有相同名稱的屬性、字段和類型。同時也隱藏具有相同簽名的所有基類方法。

   c、引入類或結(jié)構(gòu)中的索引器將隱藏具有相同名稱的所有基類索引器。

  注意:在同一成員上同時使用 new 和 override 是錯誤的。同時使用 new 和 virtual 可保證一個新的專用化點(diǎn)。在不隱藏繼承成員的聲明中使用 new 修飾符將發(fā)出警告。

  示例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 修飾符,程序?qū)⒗^續(xù)編譯和運(yùn)行,但您會收到以下警告:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

  如果嵌套類型正在隱藏另一種類型,如下例所示,也可以使用 new 修飾符修改此嵌套類型。

四、多級繼承

  一些面向?qū)ο笳Z言允許一個類從多個基類中繼承,而另一些面向?qū)ο笳Z言只允許從一個類繼承,但可以隨意從幾個接口或純抽象類中繼承。

  只有C++支持多級繼承,許多程序員對此褒貶不一。多級繼承常會引起繼承來的類之間的混亂,繼承而來的方法往往沒有唯一性,所以C#中類的繼承只可以是一個,即子類只能派生于一個父類,而有時你必須繼承多個類的特性,為了實(shí)現(xiàn)多重繼承必須使用接口技術(shù),下面是對接口的多重繼承進(jìn)行介紹:

using System ;
//定義一個描述點(diǎn)的接口
interface IPoint
{
int x {
get ;
set ;
}
int y {
get ;
set ;
}
}
interface IPoint2
{
int y {
get ;
set ;
}
}
//在point中繼承了兩個父類接口,并分別使用了兩個父類接口的方法
class Point:IPoint,IPoint2
{
//定義兩個類內(nèi)部訪問的私有成員變量
private int pX ;
private int pY ;
public Point(int x,int y) {
pX=x ;
pY=y ;
}
//定義的屬性,IPoint接口方法實(shí)現(xiàn)
public int x
{
get
{ return pX ; }
set
{ pX =value ; }
}
//IPoint1接口方法實(shí)現(xiàn)
public int y
{
get
{ return pY ; }
set
{ pY =value ; }
}
}
class Test
{
private static void OutPut( IPoint p )
{ Console.WriteLine("x={0},y={1}",p.x,p.y) ; }
public static void Main( ) {
Point p =new Point(15,30) ;
Console.Write("The New Point is:") ;
OutPut( p ) ;
string myName =Console.ReadLine( ) ;
Console.Write("my name is {0}", myName) ;
}
}

五、繼承與訪問修飾符

  訪問修飾符是一些關(guān)鍵字,用于指定聲明的成員或類型的可訪問性。類的繼承中有四個訪問修飾符: public protected internal private。使用這些訪問修飾符可指定下列五個可訪問性級別: public protected internal internal protected private。

聲明的可訪問性 意義
public 訪問不受限制。
protected 訪問僅限于包含類或從包含類派生的類型。
internal 訪問僅限于當(dāng)前項(xiàng)目。
protected internal 訪問僅限于從包含類派生的當(dāng)前項(xiàng)目或類型。
private 訪問僅限于包含類型。

  1、繼承中關(guān)于可訪問域的一些問題

  基類的所有成員(實(shí)例構(gòu)造函數(shù)、析構(gòu)函數(shù)和靜態(tài)構(gòu)造函數(shù)除外)都由派生類型繼承。這甚至包括基類的私有成員。但是,私有成員的可訪問域只包括聲明該成員的類型的程序文本。在下面的示例中

class A
{
int x ;
static void F(B b) {
b.x = 1 ; // 對
}
}
class B: A
{
static void F(B b) {
b.x = 1 ; // 錯誤
}
}

  類 B 繼承類 A 的私有成員 x。因?yàn)樵摮蓡T是私有的,所以只能在 A 的"類體"中對它進(jìn)行訪問。因此,對 b.x 的訪問在 A.F 方法中取得了成功,在 B.F 方法中卻失敗了。

  2、繼承中關(guān)于屬性的一些問題

  和類的成員方法一樣,我們也可以定義屬性的重載、虛屬性、抽象屬性以及密封屬性的概念。與類和方法一樣,屬性的修飾也應(yīng)符合下列規(guī)則:

  屬性的重載

  1. 在派生類中使用修飾符的屬性,表示對基類中的同名屬性進(jìn)行重載。

  2. 在重載的聲明中,屬性的名稱、類型、訪問修飾符都應(yīng)該與基類中被繼承的屬性一致。

  3. 如果基類的屬性只有一個屬性訪問器,重載后的屬性也應(yīng)只有一個。但如果基類的屬性同時包含get 和set 屬性訪問器,重載后的屬性可以只有一個,也可以同時有兩個屬性訪問器。

  注意:與方法重載不同的是,屬性的重載聲明實(shí)際上并沒有聲明新的屬性,而只是為已有的虛屬性提供訪問器的具體實(shí)現(xiàn)。

  虛屬性

  1. 使用virtual 修飾符聲明的屬性為虛屬性。

  2. 虛屬性的訪問器包括get 訪問器和set 訪問器,同樣也是虛的。

  抽象屬性

  1. 使用abstract 修飾符聲明的屬性為抽象屬性。

  2. 抽象屬性的訪問器也是虛的,而且沒有提供訪問器的具體實(shí)現(xiàn)。這就要求在非虛的派生類中,由派生類自己通過重載屬性來提供對訪問器的具體實(shí)現(xiàn)。

  3. abstract 和override 修飾符的同時使用,不但表示屬性是抽象的,。而且它重載了基類中的虛屬性這時屬性的訪問器也是抽象的。

  4. 抽象屬性只允許在抽象類中聲明。

  5. 除了同時使用abstract 和override 修飾符這種情況之外,static, virtual, override和abstract 修飾符中任意兩個不能再同時出現(xiàn)。

  密封屬性

  1. 使用sealed 修飾符聲明的屬性為密封屬性。類的密封屬性不允許在派生類中被繼承。密封屬性的訪問器同樣也是密封的。

  2. 屬性聲明時如果有sealed 修飾符,同時也必須要有override 修飾符。

  從上面可以看出,屬性的這些規(guī)則與方法十分類似。對于屬性的訪問器,我們可以把get 訪問器看成是一個與屬性修飾符相同、沒有參數(shù)、返回值為屬性的值類型的方法,把set 訪問器看成是一個與屬性修飾符相同、僅含有一個value 參數(shù)、返回類型為void 的方法。看下面的程序:

using System ;
public enum sex
{ woman, man, } ;
abstract public class People
{
private string s_name;
public virtual string Name
{
get
{ return s_name ; }
}
private sex m_sex ;
public virtual sex Sex
{
get
{ return m_sex ; }
protected string s_card;
public abstract string Card
{ get; set; }
}

  上面的例子中聲明了"人"這個類,人的姓名Name 和性別Sex 是兩個只讀的虛屬性:身份證號Card 是一個抽象屬性,允許讀寫,因?yàn)轭怭eople 中包含了抽象屬性Card,所以People 必須聲明是抽象的。下面我們?yōu)樽∷薜目腿司帉懸粋€類類從People 中繼承。再看下面的程序:

class Customer: People
{
string s_no ;
int i_day ;
public string No
{
get
{ return s_no ; }
set
{
if (s_no != value)
s_no = value;
}
}
public int Day
{
get
{ return i_day ; }
set
{
if (i_day != value)
i_day = value;
}
}
public override string Name
{
get { return base.Name; }
}
public override sex Sex
{
get { return base.Sex }
}
public override string Card
{
get
{ return s_ card ; }
set
{ s_ card = value ; }
}
}

  在類Customer 中,屬性Name、 Sex 和Card 的聲明都加上了override 修飾符,屬性的聲明都與基類People 中保持一致。Name 和Sex 的get 訪問器,Card 的get 和set訪問器都使用了base 關(guān)鍵字來訪問基類People 中的訪問器屬性。Card 的聲明重載了基類People 中的抽象訪問器。這樣,在Customer 類中沒有抽象成員的存在,Customer可以是非虛的。

  3、繼承中對使用可訪問性級別的限制

  聲明類型時,最重要的是查看該類型是否必須"至少"與其他成員或類型"具有同樣的可訪問性"。例如,直接基類必須至少與派生類具有同樣的可訪問性。以下聲明將導(dǎo)致編譯器錯誤,因?yàn)榛?BaseClass 的可訪問性小于 MyClass:

class BaseClass {...}
public class MyClass: BaseClass {...} // Error

  下表匯總了對使用聲明的可訪問性級別的限制。

上下文 備注
類類型的直接基類必須至少與類類型本身具有同樣的可訪問性。
接口 接口類型的顯式基接口必須至少與接口類型本身具有同樣的可訪問性。
委托 委托類型的返回類型和參數(shù)類型必須至少與委托類型本身具有同樣的可訪問性。
常數(shù) 常數(shù)的類型必須至少與常數(shù)本身具有同樣的可訪問性。
字段 字段的類型必須與至少字段本身具有同樣的可訪問性。
方法 方法的返回類型和參數(shù)類型必須至少與方法本身具有同樣的可訪問性。
屬性 屬性的類型必須至少與屬性本身具有同樣的可訪問性。
事件 事件的類型必須至少與事件本身具有同樣的可訪問性。
索引器 索引器的類型和參數(shù)類型必須至少與索引器本身具有同樣的可訪問性。
運(yùn)算符 運(yùn)算符的返回類型和參數(shù)類型必須至少與運(yùn)算符本身具有同樣的可訪問性。
構(gòu)造函數(shù) 構(gòu)造函數(shù)的參數(shù)類型必須至少與構(gòu)造函數(shù)本身具有同樣的可訪問性。

  示例:以下示例包含不同類型的錯誤聲明。每個聲明后的注釋指示了預(yù)期的編譯器錯誤。

using System ;
delegate int MyDelegate( ) ;
class B
{ // 定義一個私有的函數(shù):
static int MyPrivateMethod()
{ return 0 ; }
}
public class A
{ // 字段定義:
public B myField = new B();// 錯誤: 類型B與A字段A.myField級別不同
// 構(gòu)造函數(shù):
public readonly B myConst = new B(); //錯誤: 類型B是僅讀的
//方法:
public B MyMethod()
{
return new B();
}
//屬性:
public B MyProp
{
set { }
}
public static B operator + (A m1, B m2)
{
return new B();
}
static void Main()
{
Console.Write("Compiled successfully");
}
}


.net 調(diào)用基類(經(jīng)典文章)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人久久综合热 | 曹逼视频 | 九一视频在线 | 八戒久久精品一区二区三区 | 久久永久免费 | 国产欧美一区二区三区沐欲 | 999国内精品永久免费视频 | 久久91精品久久久久久水蜜桃 | 精品哟啊呦v视频在线观看 精品哟哟国产在线观看 | 狠狠操天天操夜夜操 | 亚洲欧美在线中文字幕不卡 | 亚洲欧美日韩国产精品一区 | 五月婷婷久 | 国产成人乱码一区二区三区在线 | 国产日韩欧美成人 | 99久久99视频 | 国产伦码精品一区二区三区 | 久久国产这里只精品免费 | 久久高清一级毛片 | 国内精品伊人久久久影视 | 国产高清一区二区三区四区 | 欧洲一级毛片免费 | 日日噜噜噜夜夜爽爽狠狠69 | 亚洲国产美女视频 | 免费国产成人高清在线观看麻豆 | 久久精品视频免费 | 精品亚洲永久免费精品 | 日本aaaa毛片在线看 | 奇米影视奇米四色888av | 亚洲国产精品高清在线一区 | 久久综合九色综合亚洲小说 | 国产免费精彩视频 | 国产精品亚洲一区二区麻豆 | 天天色天天 | 免费一级毛片在线播放 | 欧美在线播放一区二区 | 亚洲一区 欧美 | 久草久草在线视频 | 久久久久久久免费视频 | jazzjazz国产精品久久 | 久久99热不卡精品免费观看 |