using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
/// <summary>
/// abstract类 不可以被实例化 可以包含虚方法
/// abstract方法 必须存在于abstract抽象类中 不可以有实现,继承此类后子类必须重写抽象方法(virtual 方法则相反可以对比理解)
/// </summary>
public abstract class AbstactTest
{
public abstract void Fun1();
public AbstactTest()
{
Console.WriteLine("1:我是AbstactTest非静态构造函数!");
}
static AbstactTest()
{
Console.WriteLine("2:我是AbstactTest静态构造函数!");
}
public virtual void Abs_Virtual()
{
Console.WriteLine("3:我是AbstactTest类的虚方法!我可以存在于抽象类中!");
}
public static void Abs_Static()
{
Console.WriteLine("4:我是Abs_Static类的静态方法!");
}
}
/// <summary>
/// virtual方法则必须被实现 继承自此类的子类可以重写虚方法单但是非必须重写 override
/// </summary>
public class VirtualTest
{
public virtual void Fun1()
{
Console.WriteLine("5:我是virtual抽象方法,我可以被子类重写,我定义的时候必须有实现!");
}
public VirtualTest()
{
Console.WriteLine("6:我是VirtualTest非静态构造函数!");
}
static VirtualTest()
{
Console.WriteLine("7:我是VirtualTest静态构造函数!");
}
}
public class Test1 : AbstactTest
{
public override void Fun1()
{
Console.WriteLine("8:我是Test1.Fun1 重写自AbstactTest,abstract方法必须被子类重写,父类必须在静态类中!");
}
public static void OutPut()
{
Console.WriteLine("9:我是Test1,OutPut方法!");
}
public Test1()
{
Console.WriteLine("10:我是Test1非静态构造函数!");
}
static Test1()
{
Console.WriteLine("11:我是Test1静态构造函数!");
}
}
public class Test2 : VirtualTest
{
public override void Fun1()
{
Console.WriteLine("12:我是Test2.Fun1,重写自VirtualTest,virtual可以被子类实现,但是非必须!");
}
public static void OutPut()
{
Console.WriteLine("13:我是Test2,OutPut方法!");
}
public Test2()
{
Console.WriteLine("14:我是Test2非静态构造函数!");
}
static Test2()
{
Console.WriteLine("15:我是Test2静态构造函数!");
}
}
public class Print
{
public static void OutPut()
{
//静态构造函数的执行顺序 先子类后父类
//非静态构造函数的执行顺序 先父类后子类
Test1 t1 = new Test1();
Test1.Abs_Static();
Test1.OutPut();
t1.Abs_Virtual();
t1.Fun1();
Console.WriteLine("--------------------------------------");
Test2 t2 = new Test2();
Test2.OutPut();
t2.Fun1();
Console.WriteLine("--------------------------------------");
AbstactTest.Abs_Static();
VirtualTest vt = new VirtualTest();
vt.Fun1();
//AbstactTest at = new AbstactTest(); 无法创建抽象类或者接口
}
}
}
执行结果
静态构造函数,非静态构造函数执行顺序,虚方法(virtual)和抽象方法(abstract)的特性
原文:https://www.cnblogs.com/request/p/11237053.html