什么是C#中的抽象类。何时、何地以及为何使用它。

本文介绍了C#中抽象类的概念,包括如何创建、何时使用以及为何使用。抽象类不能被实例化,只能作为基类使用,可包含抽象方法和具体方法。使用抽象类的场景通常是当基类需要提供部分默认实现,而其他部分需要由子类覆盖时。文章通过示例说明了如何定义和继承抽象类,并探讨了抽象类与密封类的区别。

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

什么是C#中的抽象类。何时、何地以及为何使用它。

简介

抽象类和接口是最常被问到的面试问题之一。

抽象类:
就像类一样,Abstract 关键字用于创建抽象类。抽象类是不完整的,因此不能被实例化。抽象类只能是基类。抽象类可以同时具有抽象方法和非抽象方法(具体方法)。

例子:

abstract class Customer  // Using abstract keyword to create abstract class.
    {
        public void Print1() // Non Abstract method
        {
        }
        public abstract void Print2(); // Abstract method       
    }

如果我们声明抽象方法的主体,那么它会报错,因为我们不能声明抽象类的主体。

例子:

abstract class Customer  // Using abstract keyword to create abstract class.
    {
        public void Print1() // Non Abstract method
            {
            }

        public abstract void Print2(); // Declaring body for Abstract method                                                             // Error-Invalid token '{' in class, struct, 
                                 //   or interface member declaration
             {
             }       
    }

由于抽象类是不完整的类,因此创建抽象类的实例没有意义。抽象类不能实例化,只能作为基类使用。

例子:

namespace ConsoleApplication
{
    abstract class Customer  // Using abstract keyword to create abstract class.
    {
        public void Print1() // Non Abstract method
        {
        }
        public abstract void Print2(); // Abstract method
        {
        }       
    }
    class Program
    {
        static void Main(string[] args)
        {
            Customer c = new Customer();  //can't create instance of Abstract
                                         // class or Interface 'Customer'
        }
    }
}

如果一个类是从抽象类继承的,那么该类将负责定义该抽象方法,否则会报错。

例子:

abstract class Customer
    {
        public abstract void Print2(); // Abstract method      
    }
    class Program : Customer
    {
        static void Main(string[] args)
        {           
            // Program doesn’t implemented Abstract method  
      }
    }

如果一个类继承了一个抽象类,那么该类有两种选择

选项 1 :为从基本抽象类继承的所有抽象成员提供实现。

例子:

abstract class Customer
    {
        public abstract void Print2(); // Abstract method      
    }
    class Program : Customer
    {
        public override void Print2()
        {
            Console.WriteLine("Print2 method");
        }
        static void Main(string[] args)
        {   
        }
    }

选项 2:如果类不希望为从抽象类继承的所有抽象成员提供实现,则必须将该类标记为抽象类。

例子:

  abstract class Customer
    {
        public abstract void Print2(); // Abstract method      
    }

   abstract class Program : Customer // Marked as Abstract
    {
        static void Main(string[] args)
        {        
        }
    }

我们不能创建抽象类的实例,但是抽象类引用变量可以指向基类对象。

例子:

abstract class Customer
    {
        public abstract void Print2(); // Abstract method      
    }

    class Program : Customer
    {
        public override void Print2()
        {
            Console.WriteLine("Print2 method");
        } 
        static void Main(string[] args)

        {
            Customer objCustomer = new Program();// base class reference variable
                                                  //pointing derived class object
        }
    }

抽象类不能标记为密封的,因为它们相互矛盾。

例子:

abstract class Customer
    {
        public abstract void Print2(); // Abstract method      
    }

抽象类意味着客户类总是可以用作基类。
尽管
密封意味着客户类不能用作基类。

abstract sealed class Customer // An Abstract class cannot be sealed or static
    {
        public abstract void Print2();      
    }

抽象类可以包含抽象成员(方法、属性、索引器和事件),但不是强制性的。

何时使用抽象类:
当您要求基类应提供某些方法的默认实现而其他方法应开放以被子类覆盖时,请使用抽象类。

抽象类的目的是提供多个派生类可以共享的基类的通用定义。
例如,一个类库可能会定义一个抽象类,用作其许多函数的参数,并要求使用该库的程序员通过创建派生类来提供他们自己的类实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值