c# - C#中的抽象类构造函数

标签 c# abstract-class

在 C# 中我们不能创建抽象类或接口(interface)的对象,这意味着抽象类没有任何构造函数,对吗? 或者如果它有那么它的目的是什么?

最佳答案

正如其他人所说,抽象类通常具有构造函数(显式构造函数或由编译器创建的默认构造函数)- 任何派生类构造函数都必须以正常方式链接抽象类的构造函数。这是重要的一点……假设您有一个抽象类,它存储与实例关联的名称 - 因为您总是想要一个名称,而您不想编写 Name 每个具体派生类中的属性。您可能会提供一个构造函数,它采用该名称并将其分配给一个字段...然后每个子类构造函数都必须通过该构造函数,这样您仍然知道您总是有一个名字.如果您想了解有关构造函数链接的更多信息,请阅读 my article on it .

举个例子:

public abstract class DemoBase
{
    private readonly string name;    
    public string Name { get { return name; } }

    protected DemoBase(string name)
    {
        this.name = name;
    }

    // Abstract members here, probably
}

public class FixedNameDemo : DemoBase
{
    public FixedNameDemo()
        : base ("Always the same name")
    {
    }

    // Other stuff here
}

public class VariableNameDemo : DemoBase
{
    public VariableNameDemo(string name)
        : base(name)
    {
    }

    // Other stuff here
}

为了进一步回答您对 BoltClock 的回答的评论,asbtract 类不能有私有(private)抽象方法,但它们可以有私有(private)构造函数。事实上,在抽象类中私有(private)构造函数有时很有用,因为这意味着该类只能从同一类的程序文本中派生。这允许您创建伪枚举:

public abstract class ArithmeticOperator
{
    public static readonly ArithmeticOperator Plus = new PlusOperator();
    public static readonly ArithmeticOperator Minus = new MinusOperator();

    public abstract int Apply(int x, int y);

    private ArithmeticOperator() {}

    private class PlusOperator : ArithmeticOperator
    {
        public override int Apply(int x, int y)
        {
            return x + y;
        }
    }

    private class MinusOperator : ArithmeticOperator
    {
        public override int Apply(int x, int y)
        {
            return x - y;
        }
    }
}

在这方面,抽象私有(private)方法/属性可能有意义 - 它可以由基类访问,但由同一类的程序文本中的派生类提供。但是,规范禁止这样做。通常,protected 抽象成员可以解决同样的问题 - 但并非总是如此。

关于c# - C#中的抽象类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930271/

相关文章:

c++ - 体系结构 x86_64 的 undefined symbol (C++ 继承问题)

c++ - 在 C++ 中创建派生抽象类的实例

c# - .NET 中的反射

c# - 当我运行解决方案时,它打开的不是 mvc 中的默认页面

javascript - 在 javascript 完成加载页面后,如何使用 Anglesharp 将 HTML 作为文本获取?

c# - Powershell:无法与 .Net 程序集中存储的表单交互

java - 在Java中,是否可以要求接口(interface)的实现来覆盖对象方法?

c# - openstacksdknet 上的 CloudIdentity(找不到用户)

java - 子类忽略方法的具体实现?

java - 在抽象类中编写一个 equals 方法