02010802 类和继承02-类和成员修饰符、抽象成员、抽象类和密封类

02010802 类和继承02-类和成员修饰符、抽象成员、抽象类和密封类

1. 类访问修饰符的级别

  • 类的可访问性有两个级别:public和internal。
    • 标记为public的类可以被系统内任何程序集中的代码访问。
    • 标记的internal的类只能被他自己所在的程序集内的类看到。
      • 这是默认的可访问级别,所以除非在类的声明中显示的指定修饰符public,否则程序集外部的代码不能访问该类。
      • 可以使用internal访问修饰符显示的声明一个类为程序集内部的。

2. 程序集间的继承

2.1 引用程序集和using指令的区分
图片链接丢失
  • 迄今为止,我们一直在基类声明的同一程序集内声明派生类。但C#也允许从一个在不同的程序集内定义的基类来派生类。
  • 要从不同程序集中定义的基类派生类,必须具备以下条件。
    • 基类必须声明为public。
    • 必须在VS工程的References节点中添加包含该基类的程序集的引用。
  • 注意:增加对其他程序集的引用和增加using指令是两回事。
    • 增加对其他程序集的引用是告诉编译器所需的类型在哪里定义。
    • 增加using指令允许你引用其它的类而不必使用它们的完全限定名称。
2.2 程序集之间的调用示例
// @1 Assembly1中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaseClassNS // 基类的命名空间
{
    public class MyBaseClass
    {
        public void PrintMe()
        {
            Console.WriteLine("I'm MyBaseClass.");
        }
    }
    class Program
    {
        static void Main()
        {
        }
    }
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// @2 Assembly2中
using BaseClassNS; // 使用基类的命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsesBaseClass
{
    class DerivedClass : MyBaseClass // 继承基类
    {
        // 空类体
    }
    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass dc = new DerivedClass();
            dc.PrintMe();

            Console.ReadLine();
        }
    }
}

控制台输出:
I'm MyBaseClass.

说明:在Assembly2中添加对Assembly1的引用,在UserBaseClass命名空间中要使用using指令引用其它的类而不必使用它们的完全限定名。

3. 成员访问修饰符

  • 在研究成员访问性的细节之前,首先阐述一些通用内容。
    • 所有显式声明在类声明中的成员都是互相可见的,无论它们的访问性如何。
    • 继承的成员不在类的声明中显示声明,所以继承的成员对派生类的成员可以是可见的,也可以是不可见的。
    • 以下是5个成员访问级别的名称。
      • public
      • private
      • protected
      • internal
      • protected internal
    • 必须对每个成员指定成员访问级别。如果不指定某个成员的访问级别,它的隐式访问级别为private。
    • 成员的可访问性不能比它的类高。也就是说,如果一个类的可访问性限于它所在的程序集,那么类的成员在程序集的外部也不可见,无论它的访问修饰符是什么(即使是public修饰也不行)。

3.1 访问成员的区域划分

图片链接丢失

3.2 public → 公有成员的可访问性

图片链接丢失
  • public访问级别的限制是最少的。
    • 所有的类,包括程序集内部的类和外部的类都可以自由地访问成员。
3.3 private → 私有成员的可访问性
图片链接丢失
  • private访问级别是限制最严格的。
    • private类成员只能被它自己类的成员访问,它不能被其它的类访问,包括继承它的类。
    • 然而,private成员能被嵌套在他类中的类成员访问。(嵌套类后续学些)
3.4 protected → 受保护成员的可访问性
图片链接丢失
  • protected访问级别如同private。
    • 它允许派生自该类的类访问该成员。
    • 即使程序集外部继承自该类的类也可以访问。
3.5 internal → 内部成员的可访问性
图片链接丢失
  • 标记为internal的成员对程序集内部所有类可见,但对程序集外部的类不可见。
3.6 protected internal → 受保护内部成员的可访问性
图片链接丢失
  • 标记为protected internal的成员对所有继承该类的类以及程序集内部的所有类可见。
    • 允许访问的集合是protected修饰符允许访问的类的集合加上Internal修饰符允许访问的类的集合。
    • 这里protected和internal的结果是并集,而不是交集。
3.7 成员访问修饰符总结
修饰符 访问级别
private 只在类的内部可访问
internal 对该程序集内所有类可访问
protected 对所有继承自该类的类可访问
protected internal 对所有继承自该类或该程序集内声明的类可访问
public 对任何类可访问

4. 抽象成员

4.1 抽象成员是什么
  • 抽象成员是指设计为被覆写的函数成员,抽象成员有以下特征。
    • 必须是一个函数成员。字段和常量不能为抽象成员。
    • 必须用abstract修饰符标记。
    • 不能有实现代码块。抽象成员的代码用分号标记。
// 抽象方法
abstract public void PrintStuff(string s);

// 抽象属性
abstract public int MyProperty
{
    get; // 分号替代实现
    set; // 分号替代实现
}
4.2 可以声明为抽象成员的成员类型
  • 方法
  • 属性
  • 事件
  • 索引器
4.3 关于抽象成员的其它重要内容
  • 尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符附加到abstract修饰符。
  • 类似于虚成员,派生类中抽象成员的实现必须指定override修饰符。
4.4 虚成员和抽象成员对比
图片链接丢失

5. 抽象类

  • 抽象类是指设计为被继承的类,抽象类只能被用作其它类的基类。
    • 不能创建抽象类的实例。
    • 抽象类使用abstract修饰符声明。
// 使用abstract关键字声明一个抽象类
abstract class MyClass
{
   // 普通成员
   // 抽象成员
}

说明:抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带实现的成员的任意组合。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 抽象类可以派生自另一个抽象类
abstract class AbClass
{
    ...
}

abstract class MyAbClass : AbClass
{
    ...
}

说明:任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类。

6. 密封类

  • 密封类与抽象类相反,密封类有如下特点。
    • 密封类只能被用作独立的类,它不能被用作基类。
    • 密封类使用sealed修饰符标注。
// 使用sealed关键字声明一个密封类
sealed class MyClass
{
    ...
}

结尾

书籍:C#图解教程

著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔

译:窦衍森;姚琪琳

ISBN:978-7-115-51918-4

版次:第5版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

posted @ 2025-08-11 01:17  qinway  阅读(11)  评论(0)    收藏  举报