关于.net类的一些小细节

本文探讨了C#中抽象类与静态类的使用特点及限制条件。通过具体代码示例展示了抽象类如何定义构造函数并由派生类调用,以及静态类的特点,包括其不能实例化、不能实现接口等属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先请阅读下面的代码:

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();
        }
    }

 此段代码能正常编译执行。这告诉我们一个信息:抽象类是可以定义构造函数的,但只能由继承类来调用,这是我所不知道的。

第二段代码:

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")));
   }
}

这是.net 2.0新增加的静态类的示例代码,它不允许实例化,只能从Object继承,不能被继承,不能实现任何接口,并且不能做类型比较,这一切都和sealed abstract合并在一起的特征类似,让我们看一下static类的MSIL代码:

.class public abstract auto ansi sealed beforefieldinit Class1
      extends 
object
{
}

果然是这样的,但是你直接把一个类同时声明为sealed和abstract是不能编译通过的,会报“抽象类不能是密封的或静态的”的编译错误,说明编译器做了限制,但MSIL和CLR是支持的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值