一、如何定义类成员
1、成员定义
包含字段、方法和属性可以使用public、private(默认)、internal和protected关键字定义。也可以使用static,表示它们是类的静态成员,而不是对象实例的成员。
(1)定义字段。公共字段以PascalCasing形式命名,私有字段通常用camelCasing形式。字段也可以使用readonly关键字。表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。可以使用static,静态字段必须通过定义它们的类来访问,而不是通过这个类的对象实例来访问。可以用关键字const创建一个常量,const成员也是静态的,不需要也不能用static修饰符。
(2)定义方法 。使用标准函数格式、可访问性和可选的static修饰发来声明。如果使用了static关键字,就只能通过类来访问,不能通过对象实例来访问。也可以在方法定义中使用下述关键字:
virtual:方法可以重写
abstract:方法必须在非抽象的派生类中重写(只用于抽象类中)
override:方法重写了一个基类方法(如果方法被重写,就必须使用该关键字)
extern:方法定义放在其他地方
如果使用了override,也可以使用sealed指定在派生类中不能对这个方法作进一步的修改。
(3)定义属性。属性拥有两个类似于函数的快,一个快用于获取属性值,一个用于设置属性的值。这两个快也称为访问器,分别用get和set关键字来定义。可以用于控制对属性的访问级别。两个快可以单独存在。(当然这仅限于外部代码,因为类中的的其他代码可以访问这些大麦快能访问的数据)
属性的基本结构包括标准的可访问修饰符,后跟类名、属性名和set(get)块
get块必须有一个属性类型的返回值,简单的属性一般与私有字段相关联,以控制对这个字段的访问。
set函数以类似的方式把一个值赋给字段。这里用关键字value表示用户提供的属性值。访问器 可以有自己的访问性,访问器的可访问想不能高于它所属的属性。
private int myInt;
//Property
public int MyIntProp
{
get
{
return myInt;
}
public set
{
myInt = value;
}
}
value等于类型与属性相同的一个值。set中可以设计更多的控制。
二、如何使用类图添加成员
三、如何控制类成员的继承
1、隐藏基类方法。
当从基类继承一个(非抽象)成员时,也就继承了其实现代码,如果继承的成员是虚拟的,就可以用override关键字重写这段实现代码。无论继承的成员是否为虚拟的,都可以隐藏这些实现代码。当继承的公共成员不像预期的那样工作时,就可以隐藏它。可以使用new关键字显示的隐藏。
public class MyBaseClass
{
public void Dosomething()
{
}
}
public class MyDerivedClass:MyBaseClass
{
new public void DoSomething()
{}
}
应注意隐藏基类成员和重写它们的区别。重写方法将替换基类中的实现代码
2、调用重写或隐藏的基类的方法
无论是重写成员还是隐藏成员,都可以在派生类的内部访问基类成员。如下两种情况:
(1)要对派生类的用户隐藏继承的公共成员,但仍能在类中访问其功能
(2)要给继承的虚拟成员添加实现代码,而不是简单的用重写的新执行代码替换它。
为此,可以使用base关键字,它表示在派生类中包含基类的实现代码(在控制构造函数时,其用法是类似的)
public class MyBaseClass
{
public virtual void DoSomething(){//...}
}
public class MyDerivedClass:MyBaseClass
{
public override void DoSomething()
{
base.DoSomething();
}
}
这段代码执行包含在MyBaseClass中的DoSomething()版本,MyBaseClass是MyDerivedClass的基类,而DoSomething()版本包含在MyDerivedClass中,因为base使用的是对象实例所以在静态成员中使用它会产生错误。
this关键字与base一样,可以用在类成员的内部,且该关键字也引用对象实例。只是this引用的是当前的对象实例(即不能在静态成员中使用this关键字,因为静态成员不是对象实例的一部分)
this关键字最常用的功能是把当前对象实例的引用传递给一个方法,如下:
public void doSomething()
{
MyTargetClass myObj = new MyTargetClass();
myObj.DoSomethingWith(this);
}
其中,被实例化的MyTargetClass实例有一个DoSomethingWith()方法,该方法带有一个参数,其类型与包含上述方法的类兼容,这个参数类型可以是类的类型、由这个类继承的类类型,或者由这个类或System.Object实现的一个接口。
this关键字的另一个常见的用法是限定本地类型的成员,例:
public class MyClass
{
private int someData;
public int SomeData
{
get
{
return this.someData;
}
}
}
这个语法可以用于任意成员类型,因为可以一眼看出引用的是成员,而不是局部变量。
四、如何定义嵌套的类
可以在类中定义类,可以使用各种访问修饰符,也可以使用new关键字隐藏继承与基类的类型定义。
五、如何实现接口
1、接口定义的方式与类相似
interface IMyInterface{}
接口成员的定义与类成员定义相似,区别是:
(1)所有的接口成员必须是公共的
(2)接口成员不能包含代码体
(3)接口不能定义字段成员
(4)不能用关键字static、virtual、abstract或sealed定义
(5)类型定义成员是禁止的
如果要隐藏继承了基接口的成员,可以用关键字new来定义它们,如
interface IMyInterface
{void DoSomething();}
interface IMyDerivedInterface : IMyInterface
{new void DoSomething();}
其执行方式与隐藏继承的类成员的方式一样。
在接口中定义的属性可以定义访问快get和set中的哪一个能用于该属性。
interface IMyInterface
{int MyIntArray{get;set;}}
接口可以定义为类的成员,但不能定义为其他接口的成员,因为接口不能包含类型定义。
2、在类中实现接口
实现接口的类必须包含该接口所有成员的实现代码,且必须匹配指定的签名(包括匹配指定的get块和set块),并且必须是公共的。可以使用virtual和abstract来实现接口,但不能用static和const,还可以在基类上实现接口成员。
3、显示实现接口成员
如下代码
public class MyClass : IMyInterface
{
void IMyInterface.DoSomething(){}
public void DoSomethingElse(){}
}
后者隐式地实现接口IMyInterface的方法DoSomethingElse(),可以通过接口来访问也可以通过类来访问。以下两种方式都可以。
① MyClass myObject = new MyClass();
myObj.DoSomething();
②MyClass myObj = new MyClass();
IMyInterface myInt = myObj;
myInt.DoSomething
而DoSomething是显示实现的,只能通过第二种方式来访问。
4、用非公共的可访问性添加属性存取器
如果在定义属性的接口中只包含set或get块,就可以给类中的属性天剑get或set块,但是只有所添加的存取器的可访问修饰符比接口中定义的存取器的可访问修饰符更严格时,才可以。因为接口定义的存取器是公共的,也就是说,只能添加非公共的存取器。
六、如何使用部分类定义
1、在代码块中使用#region Fields和#endregion可以展开折叠代码区,方便阅读。但这种代码可能难以理解,因此可以是使用部分类定义(partial class definition)。就是使用部分类定义,把类的定义放在多个文件中,如可以把字段、属性和构造函数放在一个文件中,而把方法放在另一个文件中。为此,只需在每个包含部分类定义的文件中对类使用partial关键字即可。partial关键字必须出现在包含定义部分的每个文件的与此相同的位置。引用于部分类的接口也会应用于整个类。可以在一个或多个类定义中包含基类,但必须是同一个基类。
2、部分类可以定义部分方法,部分方法在部分类中定义,但没有方法体,在另个部分类中包含实现代码。在来着两个部分类中,都要使用partial关键字。部分方法可以是静态的,但它们总是私有的,且不能有返回值。它们使用的任何参数都不能是out参数,可以死ref参数,部分方法不能使用virtual、abstract、override、new、sealed和extern修饰符。
七、如何使用Call Hierarchy窗口