C#继承机制 继承与访问修饰符

继承与访问修饰符

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

3、继承中对使用可访问性级别的限制

声明类型时,最重要的是查看该类型是否必须"至少"与其他成员或类型"具有同样的可访问性"。例如,直接基类必须至少与派生类具有同样的可访问性。以下声明将导致编译器错误,因为基类 BaseClass 的可访问性小于 MyClass:
 
class BaseClass {...}
public class MyClass: BaseClass {...} // Error

下表汇总了对使用声明的可访问性级别的限制。

示例:以下示例包含不同类型的错误声明。每个声明后的注释指示了预期的编译器错误。
 
using System ;
delegate int MyDelegate( ) ;
class B 
{ // 定义一个私有的函数:
static int MyPrivateMethod() 
{ return 0 ; }
}
public class A 
{ // 字段定义:
public B myField = new B();// 错误: 类型B与A字段A.myField级别不同
// 构造函数:
public readonly B myConst = new B(); //错误: 类型B是仅读的
//方法:
public B MyMethod() 
{
return new B(); 

//属性: 
public B MyProp 
{
set { }

public static B operator + (A m1, B m2) 
{
return new B(); 
}
static void Main()
{
Console.Write("Compiled successfully");
}
}

时间: 2024-08-27 23:24:22

C#继承机制 继承与访问修饰符的相关文章

6.18 (继承+(四类访问修饰符+程序集+静态方法))提纲

继承: 一.什么是继承 概念:父亲有的东西,并且允许继承,所有孩子就都会有 一个父类可以拥有多个子类 一个子类只能拥有一个父类 二.父子之间的转换 子类可以转换成父类,这个父类只能转换成之前的子类 子类之间不可相互转换 ----------------------------------------------------------------------------- 1.访问修饰符: 对于跨类访问的一个权限限制 public : 公共的,引用命名空间即可随意访问,最高访问权限. priva

【2017-04-14】命名空间、访问修饰符、封装、继承、多态

一.命名空间 namespace 命名空间名称 如果命名空间一致,才能在他下面访问那些不同的类,如果不一致是没有办法直接访问的. 不同命名空间下都是public访问修饰符,想要调用,得在using处引用命名空间 using .... 是引用的命名空间 二.访问修饰符(写在命名任何东西的最前面) public    公共的,访问权限最高 private    私有的,访问权限最低,只能在类的内部进行访问 protected   被保护的,当前类及他的派生类中进行访问 internal    默认的

20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)

1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. internal: 只能在当前项目中访问,在同一个项目中,internal和public的权限是一样的. protected internal: protected + internal权限. 1.1:能够修饰类的访问修饰符只有两个: public / internal 1.2:接口中的成员不允许

【2017-4-14】访问修饰符 封装 继承 多态

1.命名空间/程序集 2.访问修饰符public 公共的 - 访问权限是最高的private 私有的 - 只能在类的内部进行访问 internal 默认的 - 当前命名空间(程序集)下可以访问protected 被保护的 - 当前类及它的派生类中可以访问 3.封装private 数据类型 _名称; //成员变量,字段public 数据类型 名称 //属性{ get{ return _名称; } set{ _名称 = value; }} 还可以有方法 //成员方法 4.继承: 子类:父类一个子类只

面向对象的过程、继承、封装、多态;抽象类、访问修饰符的使用、引用类型强制转换、方法重写@override与重载、空指针异常、super关键字

面向对象设计的过程:     发现类-发现类的属性-发现类的方法-优化设计: 封装: private类型的,只可以在本类中使用,当其他类调用此类时,不可使用,因此可以设置setget方法,如下所示: 构造------------------------ 默认有无参构造,若设置了有参构造,则就没有默认的无参构造了,需要自己再添加一个 方法重载------------------- 方法名相同,参数列表不同(类型,数量,顺序不同,与参数名无关): 与返回值,访问修饰符无关 面向对象(OO)的优点--

访问修饰符和继承

访问修饰符: 访问修饰符是对于跨类访问的一个权限限制 public : 公共的,引用命名空间即可随意访问,最高访问权限.private : 私有的,只有在声明它的类和结构中才可以访问,访问权限最低. Internal : 内部的,同一个程序集中所有的类都可以访问,程序集就是命名空间.Protected : 受保护的,只能在他自己和自己的子类中才能访问. 继承: 父类有且允许子类继承的东西子类都会有,一个父类可以有多个子类,一个子类只能有一个父类. class Bird : Fly//前面是子类,

访问修饰符、封装、继承

一.访问修饰符:1.pubulc:公共的,只要引用了命名空间,就可以随意进行访问     *常用 2.private:私有的,只有当前类内部才可以访问        *常用 3.internal:内部的,当前程序集内可以访问,程序集就是命名空间,此修饰符是默认的 4.protected:被保护的,当前类和它的子类才可以访问 二.命名空间: 也叫程序集,项目中每一个文件夹都是一个独立的命名空间 如果要使用某一个命名空间下的类文件,那么必须首先引用此命名空间 三.封装 打包,封起来,保护起来 pub

访问修饰符,封装,继承

一.封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型. 封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改. 封装提供了一个有效的途径来保护数据不被意外的破坏.相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)

java:包、继承,访问修饰符

包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看出目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护类.属性和方法  包命名规范 包命名原则:始终保持类的全路径唯一. 规范: [1]包名由小写字母组成,不能以圆点开头或结尾.圆的有特殊意义——包分隔符 [2]包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名.如:域名javagroup.net package net.javagroup.xx [3]