6、抽象类的构造函数可以省略

时间:2022-05-06 06:29:02

先来看abstract要领,顾名思义,abstract要领就是抽象要领。

1、抽象要领就是没有实现的,必需是形如:

 public abstract void Init();  


2、拥有抽象要领的类必需修饰一个abstract关键字从而酿成一个抽象类;但是反过来,抽象类里面不必然要有抽象要领,,好比我写了一个非抽象类,但是这个类我不想让人直接实例化,而只让人担任,我就可以把他酿成一个抽象类,虽然他里面并没有抽象要领。形如:

abstract class TestAbstractSuper  

 


3、抽象类不能被实例化,只能被担任。

4、抽象类的子类必需实现每个抽象要领。

5、抽象类里面除了可以有抽象要领以外,也可以有普通的要领。

6、抽象类的结构函数可以省略,编译器会自动加上,但是不能是一个抽象要领,而只能是一个普通的结构函数。

小结:简单归纳综合一下,抽象类不成以直接实例化,他可以有n个(n>=0)抽象要领,这些抽象方办法类必需实现。

再说virtual,他有几个特点:

1、声明了virtual的要领无需去窜改类的声明,他只在此要领上起到影响。

2、只有virtual的要领可以被子类override。

3、子类可以不ouverride父类的virtual要领,这种情况下他就像普通的父类要领一样。

小结:简单归纳综合一下,virtual关键字就是报告子类,此要领可以被override,但非强制。

上代码:

[csharp] view plain copy
//_______________________________________abstract____________________________________________//


父类-抽象类:

[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
abstract class TestAbstractSuper
{
public TestAbstractSuper()
{
Debug.WriteLine("这是父类的结构要领");
}

public abstract void Init();

public void Hello()
{
Debug.WriteLine("这是父类的非抽象要领");
}
}
}

抽象类的子类:
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
class TestAbstractSub:TestAbstractSuper
{
public TestAbstractSub()
{
Debug.WriteLine("这是子类的结构要领");
}

public override void Init()
{
Debug.WriteLine("这是子类重写的要领");
}

}
}

挪用代码:
[csharp] view plain copy
<span> </span> TestAbstractSub sub = new TestAbstractSub();
sub.Init();
sub.Hello();

输出:

[csharp] view plain copy
这是父类的结构要领
这是子类的结构要领
这是子类重写的要领
这是父类的非抽象要领


[csharp] view plain copy
//_______________________________________virtual____________________________________________//

父类:
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
class TestVirtualSuper
{
public TestVirtualSuper()
{
Debug.WriteLine("这是父类的结构要领");
}
public virtual void Init()
{
Debug.WriteLine("这是父类的虚拟要领");
}
}
}

子类:
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
class TestVirtualSub:TestVirtualSuper
{
public TestVirtualSub()
{
Debug.WriteLine("这是子类的结构要领");
}
//___________________没有重写这个虚拟要领也是可以照常运行的,会挪用父类的虚拟要领_________________________
//___________________重写了之后父类的虚拟要领不会运行,而是重写,固然可以用base.来挪用父类的要领__________
public override void Init()
{
//base.Init();
Debug.WriteLine("这是子类的重写要领");
}

}
}
挪用代码:
[csharp] view plain copy
<span> </span> TestVirtualSub sub = new TestVirtualSub();
sub.Init();

输出:
[csharp] view plain copy
这是父类的结构要领
这是子类的结构要领
这是子类的重写要领