c#面向对象编程(一)

来源:互联网 发布:multicraft linux 编辑:程序博客网 时间:2024/06/18 03:51
 

一、继承
C#中,派生类只能从一个类中继承。
C#中的继承符合下列规则:
(1)继承是可传递的。
(2)派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去己经继承的成员的定义
(3)构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
(4)派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖(Hide)己继承的成员。这种情况下,编译器不会报告错误,但会给出一个警告。对派生类的成员使用new关键字,可以关闭这个警告。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
(5)类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
二、多态
在C#中多态性的定义是:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性:
(1)编译时的多态性
编译时的多态性是通过重载来实现的。
(2)运行时的多态性
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。
当类中的方法声明前加上了virtual修饰符,我们称之为虚方法,反之为非虚。虚函数有执行体(后面谈到的抽象函数没有执行体)。
在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new, static或virtual修饰符。new关键字是对基类同名函数进行覆盖。而一般的函数重载(编译时的多态性)只是方法名称相同,但返回值类型、参数表中的参数个数、类型、顺序可能不同。
三、抽象和密封
1.抽象类
抽象类使用abstract修饰符,对抽象类的使用有以下几点规定:
(1)抽象类只能作为其它类的基类,它不能直接被实例化,而且对抽象类不能使用new操作符。抽象类如果含有抽象的变量或值,则它们要么是null类型,要么包含了对非抽象类的实例的引用。
(2)抽象类允许包含抽象成员,虽然这不是必须的。
(3)抽象类不能同时又是密封的。
2.抽象方法
一个方法声明中如果加上abstract修饰符,我们称该方法为抽象方法(abstract method )。如果一个方法被声明也是抽象的,那么该方法默认也是一个虚方法。事实上,抽象方法是一个新的虚方法,它不提供具体的方法实现代码。非虚的派生类要求通过重载为继承的虚方法提供自己的实现,而抽象方法则不包含具体的实现内容,所以方法声明的执行体中只有一个分号“;”。只能在抽象类中声明抽象方法。
abstract class A
{public abstract void F();
}
3、密封类
有时候,我们并不希望自己编写的类被继承。另一些时候,有的类己经没有再被继承的必要。C#提出了一个密封类(sealed class)的概念,帮助开发人员来解决这一问题。
密封类在声明中使用sealed修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提不出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
4、密封方法
我们己经知道,使用密封类可以防止对类的继承。C#还提出了密封方法(sealed method)的概念,以防止在方法所在类的派生类中对该方法的重载。
不是类的每个成员方法都可以作为密封方法,密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。
class A
{
    public virtual void F()
    {
        Console.WriteLine("A.F");

    }
    public virtual void G()
    {     Console.WriteLine("A.G");
    }
}
class B: A
{        sealed override public void F()
    {     Console.WriteLine("B.F");
    }
}

原创粉丝点击