首先请阅读下面的代码:
public
abstract
class
AClass
{
public AClass()
{
}
public abstract void Add();
public void SAdd()
{
}
}
public class BClass:AClass
{
public BClass(): base ()
{
this .Add();
}
public override void Add()
{
}
}
class CClass
{
void DoIt()
{
new BClass().Add();
new BClass().SAdd();
}
}
{
public AClass()
{
}
public abstract void Add();
public void SAdd()
{
}
}
public class BClass:AClass
{
public BClass(): base ()
{
this .Add();
}
public override void Add()
{
}
}
class CClass
{
void DoIt()
{
new BClass().Add();
new BClass().SAdd();
}
}
此段代码能正常编译执行。这告诉我们一个信息:抽象类是可以定义构造函数的,但只能由继承类来调用,这是我所不知道的。
第二段代码:
using
System;
interface ITest
{
}
public static class Class1
{
}
class Class2
{
}
static class Class3 // :ITest
{
}
public class IsTest
{
public static void Test ( object o)
{
// Class1 a;
Class2 b;
if (o is Class1)
{
Console.WriteLine ( " o is Class1 " );
// a = (Class1)o;
// do something with a
}
else if (o is Class2)
{
Console.WriteLine ( " o is Class2 " );
// b = (Class2)o;
// do something with b
}
else
{
Console.WriteLine ( " o is neither Class1 nor Class2. " );
}
}
public static void Main()
{
// Class1 c1;
Class2 c2 = new Class2();
// Test (c1);
Test (c2);
Test ( " a string " );
// Console.WriteLine (Activator.CreateInstance(Type.GetType("Class3")));
}
}
interface ITest
{
}
public static class Class1
{
}
class Class2
{
}
static class Class3 // :ITest
{
}
public class IsTest
{
public static void Test ( object o)
{
// Class1 a;
Class2 b;
if (o is Class1)
{
Console.WriteLine ( " o is Class1 " );
// a = (Class1)o;
// do something with a
}
else if (o is Class2)
{
Console.WriteLine ( " o is Class2 " );
// b = (Class2)o;
// do something with b
}
else
{
Console.WriteLine ( " o is neither Class1 nor Class2. " );
}
}
public static void Main()
{
// Class1 c1;
Class2 c2 = new Class2();
// Test (c1);
Test (c2);
Test ( " a string " );
// Console.WriteLine (Activator.CreateInstance(Type.GetType("Class3")));
}
}
这是.net 2.0新增加的静态类的示例代码,它不允许实例化,只能从Object继承,不能被继承,不能实现任何接口,并且不能做类型比较,这一切都和sealed abstract合并在一起的特征类似,让我们看一下static类的MSIL代码:
.
class
public
abstract
auto ansi
sealed
beforefieldinit Class1
extends object
{
}
extends object
{
}
果然是这样的,但是你直接把一个类同时声明为sealed和abstract是不能编译通过的,会报“抽象类不能是密封的或静态的”的编译错误,说明编译器做了限制,但MSIL和CLR是支持的。