代码之家  ›  专栏  ›  技术社区  ›  Justin R.

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

  •  20
  • Justin R.  · 技术社区  · 15 年前

    section 10.1.1.1 ,表示:

    允许使用抽象类(但是 不需要)包含摘要

    这允许我创建如下类:

    public abstract class A
    {
        public void Main() 
        {
            // it's full of logic!
        }
    }
    

    public abstract class A
    {
        public virtual void Main() { }
    }
    
    public abstract class B : A
    {
        public override sealed void Main()
        {
            // it's full of logic!
        }
    }
    

    这确实是一个具体的类;它只是抽象的,因为不能实例化它。例如,如果我想执行 B.Main() 我必须先得到一个B的实例,这是不可能的。

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

    9 回复  |  直到 8 年前
        1
  •  23
  •   Michael Petito    15 年前

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

    public abstract class Pet
    {
        public string Name{get;set;}
    }
    
    public class Dog : Pet
    {
        public void Bark(){ ... }
    }
    

    所有的宠物都有名字,但宠物本身是一个抽象的概念。宠物的例子必须是狗或其他动物。

    这里的区别在于,基类声明所有pet至少由一个 Name 财产。

        2
  •  11
  •   Mike Marshall    15 年前

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

    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()
        {
        }
    }
    
        3
  •  8
  •   nlawalker    15 年前

    我认为对你的问题有一个更准确的表述:为什么C#允许一个抽象类 只有

    答案是:没有理由不这样做。也许有人有某种组织结构,他们喜欢在上面有一个不可实例化的类,即使它下面的类只是继承和不添加任何内容。没什么好理由 为了支持这一点。

        4
  •  3
  •   Jay    15 年前

    你说它——因为你不能实例化它;它只是一个模板。

    如果您将它声明为抽象类,那么它就不是“真正的具体类”。作为设计选择提供给您。

    抽象 真实世界的物体,并具有可读性。您可能需要声明类型为的参数 Car ,但不希望将对象声明为 --你想要所有类型的对象 小型车 被实例化为 Truck , Sedan , Coupe ,或 Roadster . 事实上 小型车 要求 作为继承者的抽象版本,要添加实现的继承者不会减损它的价值,因为它本身无法实例化。

        5
  •  1
  •   Chinjoo    15 年前

        6
  •  1
  •   Jeff Yates    15 年前

    关于用法,使用 abstract 在类声明上,但没有抽象成员与拥有类是一样的 public 但是使用 protected 关于它的构造器。两者都强制派生类以便实例化它。

    摘要 它告诉其他人这个类永远不会被自己实例化,即使它没有 virtual 成员。而保护构造器并没有这样的断言。

        7
  •  0
  •   ralf.w.    15 年前

    编译器不会阻止实现逻辑,但在您的情况下,我只会省略 摘要 { throw Exception("must inherit"); }

        8
  •  0
  •   Charles    15 年前

    下面是一个潜在的原因:

    Layer Supertype

    对于所有的物体来说这并不少见 想在整个过程中复制吗 系统。你可以移动所有这些 行为转化为公共层 超型。

    马丁福勒

    没有理由这么做 在一个抽象类中只有具体的方法——只是不太常见。这个 层超型 在这种情况下,这可能是有意义的。

        9
  •  0
  •   Jordão    15 年前

    我看到抽象类有两个主要用途:

    • 一个不完整的类,必须专门化才能提供一些具体的服务。在这里,抽象成员 . 类将提供一些子类可以使用的服务,并且可以定义抽象成员,这些抽象成员用于提供服务,如 Template Method Pattern . 这种类型的抽象类旨在创建

    • 只提供静态 . 在这种情况下,抽象成员毫无意义。C#支持这一观点 static classes

    推荐文章