为什么C#允许没有抽象成员的抽象类?

Jus*_* R. 20 c# language-design abstract

C#规范第10.1.1.1节规定:

允许(但不是必需)抽象类来包含抽象成员.

这允许我创建这样的类:

public abstract class A
{
    public void Main() 
    {
        // it's full of logic!
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

public abstract class A
{
    public virtual void Main() { }
}

public abstract class B : A
{
    public override sealed void Main()
    {
        // it's full of logic!
    }
}
Run Code Online (Sandbox Code Playgroud)

这真是一个具体的课程; 它只是抽象的,因为一个人无法实例化它.例如,如果我想执行逻辑,B.Main()我必须首先获得B的实例,这是不可能的.

如果继承者实际上不必提供实现,那么为什么称它为抽象?

换句话说,为什么C#允许只有具体成员的抽象类?

我应该提一下,我已经熟悉了抽象类型和成员的预期功能.

Mic*_*ito 23

也许一个很好的例子是一个公共基类,它为派生类提供共享属性和其他成员,但不代表具体对象.例如:

public abstract class Pet
{
    public string Name{get;set;}
}

public class Dog : Pet
{
    public void Bark(){ ... }
}
Run Code Online (Sandbox Code Playgroud)

所有宠物都有名字,但宠物本身就是一个抽象的概念.宠物的实例必须是狗或其他种类的动物.

这里的不同之处在于,基类不是提供应该被实现者覆盖的方法,而是声明所有宠物至少由一个Name属性组成.


Mik*_*all 11

这个想法是强制实现者从类派生,因为它只是为一个可能更专业的实现提供基础.因此,基类虽然没有任何抽象成员,但可能只包含核心方法,这些属性可以用作扩展的基础.

例如:

public abstract class FourLeggedAnimal
{

    public void Walk()
    {
        // most 4 legged animals walk the same (silly example, but it works)
    }

    public void Chew()
    {

    }
}

public class Dog : FourLeggedAnimal
{
    public void Bark()
    {
    }
}

public class Cat : FourLeggedAnimal
{
    public void Purr()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个突出的例子是System.Windows.Forms.ButtonBase,Button,CheckBox和RadioButton从中派生出来.它没有抽象成员,但有许多虚拟方法和属性. (6认同)

nla*_*ker 8

我认为你的问题稍微准确一点就是:为什么C#允许只有具体成员的抽象类?

答案:没有充分的理由不这样做.也许有人在那里有一些组织结构他们喜欢在顶部有一个不可实例化的类,即使它下面的一个类只是继承并且什么都不添加.没有理由支持这一点.