類的具體使用
-
靜態成員、非靜態成員
1:靜態成員:使用static關鍵字聲明靜態成員(VB.NET使用Shared聲明靜態成員)。靜態成員屬於類,能由該類的所有實例所共享。
2:非靜態成員:無關鍵字聲明,則默認為非靜態成員。非靜態成員屬於類的實例——對象。
3:使用:
C#:
public static int MyInt_1 = 0;//靜態成員
public int MyInt= 0;//使用public允許外部類訪問
VB.NET:
Public Shared MyStr_1 As String '靜態成員類共有
Public MyStr As String '非靜態成員,屬於類的實例——對象
-
類的屬性
1:屬性中包含兩個塊:set和get,set塊負責屬性的寫入工作,get塊負責屬性的讀取工作。在兩個塊中都可以做一些其他操作,如在set中驗證賦的值是否符合要求並決定是否進行賦值。當缺少其中一塊時屬性就只能讀或只能寫,set和get塊中屬性必需有一個,因為即不能讀又不能寫的屬性是沒有意義的。
2:屬性的使用
C#:
public string Name_2
{
get { return MyStr; }//可在get,set訪問器中
set { MyStr = value; }
}
public string Name_3//省略語句
{
get ;set;
}
VB.NET:
Property Name_1 As String
Get '讀取
Return MyStr
End Get
Set(value As String) '寫入
MyStr = value
End Set
End Property
-
同類中方法的重載
1:定義:一個類中的方法與另一個方法同名,但是參數表不同,這種方法稱之為重載方法。(注:VB.NET中重載同樣可以應用到父類與子類當中。即子類重載了父類的方法。對於同類之間的重載可以用overloads關鍵字,也可省略不用。)
2:如下所示:
C#:
public void TestMath_2(int flag)
{
Console.WriteLine("調用類TestClass的TestMath_2方法:" + flag);
}
public void TestMath_2() //TestMath_2方法的重載(若調用方法TestMath_2時,有時需要參數flag,有時又不需要參數flag,可重構該方法,依實際情況選擇調用)
{
Console.WriteLine("調用類TestClass的TestMath_2方法(無參數)" );
}
VB.NET:
Sub TestMath_2(ByVal flag As Integer) '作用域默認為Public
Console.WriteLine("調用類TestClass的TestMath_2方法:" & flag) '不同類型之間的連接時需用連接符 &
End Sub
Sub TestMath_2() '重載方法TestMath_2
Console.WriteLine("調用類TestClass的TestMath_2方法(無參數)")
End Sub
'等同於上述的方法重載
Sub TestMath(Optional flag As Integer = 0) '通過Optional關鍵字表明參數flag可省略,此時默認flag=0
If (flag = 0) Then
Console.WriteLine("調用類TestClass的TestMath方法(無參數)")
Else
Console.WriteLine("調用類TestClass的TestMath方法:" & flag)
End If
End Sub
3:當分別調用方法:
C#:
TestClass.Instance().TestMath_2(i);//有參數
TestClass.Instance().TestMath_2();//無參數
VB.NET:
TestClass.Instance().TestMath_2(100) '有參數
TestClass.Instance().TestMath_2() '無參數
TestClass.Instance().TestMath(200) '有參數
TestClass.Instance().TestMath() '無參數
4:運行結果圖:
-
子類對父類方法的重寫與覆蓋
1:重寫定義:用關鍵字 virtual 修飾父類的方法,叫虛方法,此虛方法可以在子類中用override 聲明同名的方法,這叫"重寫"。 重寫會改變父類方法的功能(VB.NET使用Overridable表明父類方法可被改寫)
2:重寫如下所示:
C#:
public virtual void TestMath_3()//使用關鍵字virtual表明方法TestMath_3允許被子類重寫。
{
Console.WriteLine("調用類TestClass的TestMath_3方法");
}
……
public override void TestMath_3()
{
Console.WriteLine("調用類TestClass_1的TestMath_3方法:重寫父類TestClass的方法TestMath_3");
}
VB.NET:
Public Overridable Sub TestMath_3() '使用Overridable表明方法允許被子類重寫
Console.WriteLine("調用類TestClass的TestMath_3方法")
End Sub
Public Overrides Sub TestMath_3() '子類重寫父類的方法
Console.WriteLine("調用類TestClass_1的TestMath_3方法:重寫父類的方法")
End Sub
3:覆蓋定義:在子類中用 new關鍵字修飾定義的與父類中同名的方法,叫覆蓋。 覆蓋不會改變父類方法的功能。
(注:VB.NET無覆蓋,但提供了Overrides重載父類方法來達到與覆蓋相同的功能。)
4:覆蓋如下所示:
C#:
public static TestClass Instance()//使用static表明方法Instance屬於類TestClass,無static表明屬於類的實例——對象。
{
TestClass MyTestClass = new TestClass();
Console.WriteLine("實例化類TestClass:");
return MyTestClass;
}
public static new TestClass_1 Instance()//方法的覆蓋(覆蓋:使用關鍵字new,用以覆蓋父類的方法Instance,阻止TestClass_1調用父類TestClass的方法Instance)
{
TestClass_1 MyTestClass = new TestClass_1();
Console.WriteLine("實例化類TestClass_1:");
return MyTestClass;
}
VB.NET:
Public Shared Function Instance() As TestClass '使用shared關鍵字,聲明類的靜態成員
Dim MyTestClass = New TestClass()
Console.WriteLine("實例化類TestClass:")
Return MyTestClass
End Function
Public Overloads Shared Function Instance() As TestClass_1 '使用Overloads,來避免被父類TestClass的方法Instance覆蓋子類的Instance
Dim MyTestClass = New TestClass_1()
Console.WriteLine("實例化類TestClass_1:")
Return MyTestClass
End Function
5:重寫與覆蓋的區別:重寫會改變父類方法的功能,覆蓋不會改變父類方法的功能。
C#:
TestClass.Instance().TestMath_3();
TestClass_1.Instance().TestMath_3();
TestClass MyTestClass = new TestClass_1();
MyTestClass.TestMath_2();//覆蓋的方法TestMath_2任然調用父類TestClass的方法TestMath_2
MyTestClass.TestMath_3();//重寫的方法TestMath_3調用子類TestClass_1的方法TestMath_3
VB.NET:
TestClass.Instance().TestMath_3()
TestClass_1.Instance().TestMath_3()
'使用子類來聲明一個父類
Dim MyTestClass As TestClass = New TestClass_1()
MyTestClass.TestMath_2() '對象MyTestClass調用的任然是父類的方法(覆蓋)
MyTestClass.TestMath_3() '對象MyTestClass調用的是子類的方法(重寫)
6:運行結果: