本章内容:
- 如何定义类成员
- 如何使用类图添加成员
- 如何控制类成员的继承
- 如何定义嵌套的类
- 如何实现接口
- 如何使用部分类定义
- 如何使用Call Hierarchy窗口
本章要点
主题 | 重要概念 |
成员定义 |
可以在类中定义字段、方法、属性成员。 字段用可访问性、名称和类型定义, 方法用可访问性、返回类型、名称和参数定义, 属性用可访问性、名称、get 和/或 set存取器定义 各个属性存取器可以有自己的可访问性, |
成员隐藏和重写 |
属性和方法可以在基类中定义为抽象或虚拟,以定义继承。 派生类必须实现抽象的成员,使用override关键字可以重写虚拟的成员。 派生类还可以用new关键字提供新的实现代码,用sealed关键字禁止进一步重写虚拟成员 基类的实现代码可以用base关键字调用 |
接口的实现 |
实现了接口的类必须实现该接口定义为公共的所有成员 可以隐式或显示实现接口,其中显示实现代码只能通过接口引用来使用 |
部分定义 |
使用partial关键字可以把类定义放在多个代码文件中。 还可以使用partial挂件自创建部分方法 部分方法有一些限制,包括没有返回值或out参数 如果没有提供实现代码,部分方法就不能编译 |
10.1 成员定义
- public 成员可以有任何代码访问
- private 成员只能由类中的代码访问
- internal 成员只能由定义它的程序集内部代码访问
- protected 成员只能由类或派生类中的代码访问
也可以使用关键字static来声明字段、方法、属性,表示他们是类的静态成员
定义字段
字段用标准的变量声明格式和前面介绍的修饰符来定义
class MyClass
{
public int MyInt;
}
字段也可以使用关键字readonly,表示这个字段只能子啊执行构造函数的过程中赋值。或由初始化赋值语句赋值
静态字段必须通过定义他们的类来访问,而不是通过这个类的对象实例来访问
另外可以使用关键字const 来创建一个常量。const成员也是静态的
定义方法
方法使用标准函数格式、可访问性和可选的static修饰符来声明。
class MyClass
{
public string GetString()
{
return "Here is a string.";
}
}
如果使用static关键字,这个方法就只能通过类来访问,不能通过对象实例来访问。
方法定义关键字:
- Virtural 方法可以重写
- abstract 方法必须在非抽象的派生类中重写
- override 方法重写了基类方法
- extern 方法定义放在其他地方
方法重写示例:
1 public class MyBaseClass 2 3 { 4 5 public virtural void DoSomething() 6 7 { 8 9 //Base implementation. 10 11 } 12 13 } 14 15 public class MyDerivedClass:MyBaseClass 16 17 { 18 19 public override void Dosomething() 20 21 { 22 23 //Derived class implementation,overrides base implementation. 24 25 } 26 27 }
如果使用了override,也可以使用sealed 指定在派生类中不能对这个方法作进一步的修改,即这个方法不能由派生类重写
public class MyDerivedClass:MyBaseClass
{
public override sealed void DoSomething()
{
//derived class implementation,overrides base implementation.
}
}
定义属性
属性拥有两个类似于函数的块,一个用于获取属性的值,一个用于设置属性的值
这两个块也称为访问器:get和set关键字来定义
标准的基本结构
public int MyIntProp
{
get
{
//Property get code.
}
set
{
//Property set code.
}
}
get 块必须有一个属性类型的返回值
10.2 类成员的其他议题
隐藏基类方法
当从基类继承一个成员是,也就继承了其现的代码。
如果继承的成员是虚拟,就可以用override关键字重写这段实现代码。
无论继承的成员是否为虚拟,都可以隐藏这些实现代码
public class MyBaseClass
{
public void Dosomething(){ }
}
public class MyDericedClass:MyBaseClass
{
public void Dosomething(){ }
//或者
new public void DoSomething(){ } //new 关键字显示表明意图
}
----------------------------------
重写方法将替换基类中的实现代码
public class MyBaseClass
{
public virtual void Dosomething(){ }
}
public class MyDericedClass:MyBaseClass
{
public override void Dosomething(){ }
//或者
new public void DoSomething(){ }
}
调用重写或隐藏的基类方法
无论是重写成员还是隐藏成员,都可以在派生类的内部访问基类成员 。例如:
- 要对派生类的用户隐藏继承的公共成员,但仍能在类中访问其功能
- 要给继承的虚拟成员添加实现代码,而不是简单地用重写的新执行代码替换它
可以使用base关键字,表示包含在派生类中的基类的实现代码
public class MyBaseClass
{
public virtual void Dosomething(){ }
}
public class MyDericedClass:MyBaseClass
{
public override void Dosomething()
{
base.DoSomething(); //基类的方法
}
}
this关键字
与base一样,this也可以用在类成员的内部,且该关键字也引用对象实例。this应用的是当前的对象实例
(不能子啊静态成员中使用this关键字,以为静态成员不是对象实例的一部分)
this关键字最常用的功能是把当前对象实例的引用传递给一个方法
另一个常见用法是先定本地类型的成员
public class MyClass { private int someData; public int SomeData { get { return this.someData; } } }
嵌套的类型定义
类可以嵌套在其他类中进行定义
主要用于定义对应其包含类来说是私有的类,这样,名称空间中的其他代码就不能访问。
接口的实现
- 不允许使用访问修饰符(public private protected internal),所有的接口成员都是公共的
- 接口成员不能包含代码体
- 接口不能定义字段成员
- 接口成员不能用关键字static、virtual、abstract、sealed来定义
- 类型定义成员是禁止的
要隐藏继承基接口的成员,可以使用关键字new来定义
interface IMyBaseInterface
{
void Dosomething();
}
interface IMyDeriverInterface : IMyBaseInterface
{
new void Dosomething();
}
继承一个实现给定接口的基类,就意味着派生类隐式地支持这个接口
在基类中把实现代码定义为虚拟,派生类就可以替换该实现代码,而不是隐藏他们。
1.显示实现接口成员
2.用费公共的可访问性添加属性存取器
10.4 部分类定义
使用部分类定义,把类的定义放在多个文件中
只需子啊每个包含部分类定义的文件中对类使用partial关键字即可,
使用部分类定义,partial关键字必须出现在包含丁一部分的每个文件的相同位置
注意:应用于部分类的接口也会应用于整个类。
public partial class MyClass:IMyInterface1{}
public partial class MyClass:IMyInterface2{}
和
public class MyClass:IMyInterface1,IMyInterface2
是等价的
部分类定义可以在一个部分类定义文件或多个部分类定义文件中包含基类,但是如果基类在多个定义文件中指定,必须是同一个基类,因为类只能继承一个基类
10.5 部分方法定义
部分类也可以定义部分方法。
部分方法在部分类中定义,但没有方法体,子啊另一个部分类中包含实现代码。在这两个部分类汇总,都要使用partial关键字
部分方法也可以是静态的,但他们总是私有的,且不能有返回值。
不能使用out参数,但可以是ref参数