类的具体使用
-
静态成员、非静态成员
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:运行结果: