先来看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
这是父类的结构要领
这是子类的结构要领
这是子类的重写要领