欢迎光临
我们一直在努力

深入剖析C#继承机制6-.NET教程,C#语言

建站超值云服务器,限时71元/月

五、继承与访问修饰符

  访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性。类的继承中有四个访问修饰符: public protected internal private。使用这些访问修饰符可指定下列五个可访问性级别: public protected internal internal protected private。

声明的可访问性 意义

public 访问不受限制。

protected 访问仅限于包含类或从包含类派生的类型。

internal 访问仅限于当前项目。

protected internal 访问仅限于从包含类派生的当前项目或类型。

private 访问仅限于包含类型。

  1、继承中关于可访问域的一些问题

  基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都由派生类型继承。这甚至包括基类的私有成员。但是,私有成员的可访问域只包括声明该成员的类型的程序文本。在下面的示例中

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。因为该成员是私有的,所以只能在 a 的"类体"中对它进行访问。因此,对 b.x 的访问在 a.f 方法中取得了成功,在 b.f 方法中却失败了。

  2、继承中关于属性的一些问题

  和类的成员方法一样,我们也可以定义属性的重载、虚属性、抽象属性以及密封属性的概念。与类和方法一样,属性的修饰也应符合下列规则:

  属性的重载

  1. 在派生类中使用修饰符的属性,表示对基类中的同名属性进行重载。

  2. 在重载的声明中,属性的名称、类型、访问修饰符都应该与基类中被继承的属性一致。

  3. 如果基类的属性只有一个属性访问器,重载后的属性也应只有一个。但如果基类的属性同时包含get 和set 属性访问器,重载后的属性可以只有一个,也可以同时有两个属性访问器。

  注意:与方法重载不同的是,属性的重载声明实际上并没有声明新的属性,而只是为已有的虚属性提供访问器的具体实现。

  虚属性

  1. 使用virtual 修饰符声明的属性为虚属性。

  2. 虚属性的访问器包括get 访问器和set 访问器,同样也是虚的。

  抽象属性

  1. 使用abstract 修饰符声明的属性为抽象属性。

  2. 抽象属性的访问器也是虚的,而且没有提供访问器的具体实现。这就要求在非虚的派生类中,由派生类自己通过重载属性来提供对访问器的具体实现。

  3. abstract 和override 修饰符的同时使用,不但表示属性是抽象的,。而且它重载了基类中的虚属性这时属性的访问器也是抽象的。

  4. 抽象属性只允许在抽象类中声明。

  5. 除了同时使用abstract 和override 修饰符这种情况之外,static, virtual, override和abstract 修饰符中任意两个不能再同时出现。

  密封属性

  1. 使用sealed 修饰符声明的属性为密封属性。类的密封属性不允许在派生类中被继承。密封属性的访问器同样也是密封的。

  2. 属性声明时如果有sealed 修饰符,同时也必须要有override 修饰符。

  从上面可以看出,属性的这些规则与方法十分类似。对于属性的访问器,我们可以把get 访问器看成是一个与属性修饰符相同、没有参数、返回值为属性的值类型的方法,把set 访问器看成是一个与属性修饰符相同、仅含有一个value 参数、返回类型为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 是一个抽象属性,允许读写,因为类people 中包含了抽象属性card,所以people 必须声明是抽象的。下面我们为住宿的客人编写一个类类从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 关键字来访问基类people 中的访问器属性。card 的声明重载了基类people 中的抽象访问器。这样,在customer 类中没有抽象成员的存在,customer可以是非虚的。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 深入剖析C#继承机制6-.NET教程,C#语言
分享到: 更多 (0)

相关推荐

  • 暂无文章