前提是父类中该要被重写的方法必须声明为virtual或者是abstract类型

时间:2022-05-06 07:17:58

类界说中可以使用的访谒修饰符组合

none or internal 类只能在当前工程中访谒

public 类可以在任何处所访谒

abstract or internal abstract 类只能在当前工程中访谒,不能实例化,只能担任

public abstract 类可以在任何处所访谒,不能实例化,只能担任

sealed or internal sealed 类只能在当前工程中访谒,不能派生,只能实例化

public sealed 类可以在任何处所访谒,不能派生,只能实例化

 

结构函数

其名称同类名,没有返回值,也不需要void ,在new的时候挪用。

所有的类都有结构函数,只不过C#会默认一个无参数的结构函数,如果不界说,则使用默认。

如果界说了结构函数,则默认掉效。

 

嵌套类

   C#允许使用类嵌套

     嵌套类型被视为是外层类型的成员,因此嵌套类型可以访谒外层类型中的所有其他成员。

     按照类的成员默认访谒修饰符为:private的原则,嵌套类默认访谒修饰符为private

     嵌套类型可以*访谒外层类型的成员,而不在乎那些成员是否私有。外层类型如果想访谒嵌套类型,则要受到访谒法则的限制。

     关于嵌套类的担任(后面会详细说明担任),如果一个类型担任了一个包罗嵌套类型的类型,那么它也会自然的担任基类型中的嵌套类型,因为阿谁嵌套类型自己就是基类型的一个成员。因此只要阿谁嵌套类型不是private或者天生不能被担任的,子类型中新声明的嵌套类型还可以担任阿谁嵌套类型。

 

析构函数

不能在布局中界说析构函数。 只能对类使用析构函数。

一个类只能有一个析构函数。

无法担任或重载析构函数。

无法挪用析构函数。 它们是被自动挪用的。

析构函数既没有修饰符,也没有参数。

一. 析构函数的特征:

析构函数只能存在于类中,而不能存在于布局中;析构函数不能有任何修饰符,包孕访谒控制修饰符,静态修饰符,抽象修饰符,虚拟修饰符等都不能有;析构函数没有参数,这就意味着不能有任何重载。

二. 析构函数的挪用时机:

析构函数会在东西被垃圾收集器回收时挪用,但垃圾收集器有个特点,它是懒惰的, 它并不会在变量出了感化域和生命期后当即回收,而是在它认为适当的时候才回收,一般是内存紧张的时候。

 

例子:

class Car { ~Car() // destructor { // cleanup statements... } }

 

东西的消亡

东西超过感化范畴 消亡

东西 引用手动赋值 null 消亡

 

类的担任

担任是面向东西编程的一个重要特性。任何类都可以从另一个类中担任,这就是说,,这个类拥有它担任的类的所有成员。在OOP 中,被担任的类称为父类(也称为基类)。注意,C#中的东西仅能直接派生于一个基类,固然基类也可以有本身的基类。

类的担任一个重要感化是子类可重用父类的代码。这样就可以在一个处所集中维护一份代码,制止了很多的反复的代码。

c#只撑持单担任

 

担任语法 :

class ModelACar : Car

重构

好比此刻我有两个类,一个是Cat,另一个是Dog,他们都有叫要领,如果我每个类都去写实现叫要领,就造成了代码的反复,怎么办那,可以把叫要领抽象出来,放到一个父类Animal中,让子类Cat、Dog去担任

 

【重写】

       多呈此刻多态里,父类里写一个virtual要领或abstract要领,子类通过override重写去实现父类的要领

1.重写父类的要领要用到override关键字(具有override关键字修饰的要领是对父类中同名要领的新实现)

     2.要重写父类的要领,前提是父类中该要被重写的要领必需声明为virtual或者是abstract类型。给父类中要被重写的要领添加virtual关键字暗示可以在子类中重写它的实现。(注意:C#中的要领默认并不是 virtual类型的,因此要添加virtual关键字才华够被重写)

3.virtual关键字用于将要领界说为撑持多态,有virtual关键字修饰的要领称为“虚拟要领”

class Animal { public virtual void GetShoutSound() { } } class Cat:Animal { public override void GetShoutSound() { Console.WriteLine("猫的叫声为:喵"); } } class Dog : Animal { public override void GetShoutSound() { Console.WriteLine("狗的叫声为:"); } }