抽象类可以用作非基类吗?

时间:2014-04-03 06:34:40

标签: c# abstract-class

我是C#编程的新手。我理解,如果类包含任何抽象方法,则必须将其修改为抽象类,并且必须在类层次结构中的任何子类中提供其实现。 但我的问题是我们是否可以在没有任何抽象方法的情况下拥有抽象类(因此它不必是基类),如果是,那么具有什么意义呢?相同。请帮忙。 :)

3 个答案:

答案 0 :(得分:4)

是的,您可以拥有abstract基类,而无需任何抽象方法。好处是您无法创建此类的实例。

需要考虑用接口替换该抽象类。区别在于接口可能不包含任何实现,但在抽象类中,您可以为任何继承者可能使用的方法提供一些实现。

答案 1 :(得分:1)

你不能创建抽象类的实例,如果你不使用这个类作为基础 - 它是没用的(只有一些使用反射的棘手目标才有可能)

答案 2 :(得分:1)

是的,它可以使用而无需实现子类。基本上,你有三种“方法”来定义和调用方法:

  • static:可以直接在抽象类上调用的方法,因为它们根本不需要实例。
  • abstract: 必须在子类中实现的方法(请注意,其中一个的存在并不会阻止您直接使用任何现有的静态方法! )
  • “Regular”:普通方法,直接在抽象类中实现,可以通过子类的实例调用。请注意,您只能通过子类调用它们,因为您只能拥有子类的实例(而不是抽象类本身)。这样的子类必须也可以通过定义实现抽象类中的任何抽象方法(否则你将得到编译时错误)。

以下简单的控制台应用程序提供了一个很好的,具体的(没有双关语)示例:

using System;
namespace ConsoleStuff
{
    public abstract class MyAbstractClass
    {
        public abstract void DoSomethingAbs();

        public void DoSomethingElse()
        {
            Console.WriteLine("Do something general...");
        }

        public static void TakeABreak()
        {
            Console.WriteLine("Take a break");
        }
    }

    class MyImplementation : MyAbstractClass
    {
        public override void DoSomethingAbs()
        {
            Console.WriteLine("Do something Specific...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Static method; no instance required
            MyAbstractClass.TakeABreak();

            var inst = new MyImplementation();
            inst.DoSomethingAbs();  // Required implementation in subclass
            inst.DoSomethingElse(); // Use method from the Abstract directly

            Console.ReadKey();
        }
    }
}