C# C语言中的抽象类构造函数#

C# C语言中的抽象类构造函数#,c#,abstract-class,C#,Abstract Class,在c#中,我们不能创建抽象类或接口的对象,这意味着抽象类没有任何构造函数,对吗? 或者如果它有,那么它的用途是什么?否。这意味着不允许运算符new从此类创建对象 其目的可能是分配/初始化类的某些属性 抽象通常留下一些方法来实现 关于接口,此结构仅保存方法、委托或事件的签名。可以在使用接口的类中实现。不能创建对象 了解 编辑: 抽象类中构造函数的用途是什么 当一个类继承另一个类时,必须在对象装箱时首先创建它的父类。在类中,不实现某些特殊构造函数总是使用默认构造函数[className()]。当您重

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

否。这意味着不允许运算符new从此类创建对象

其目的可能是分配/初始化类的某些属性

抽象通常留下一些方法来实现

关于接口,此结构仅保存方法、委托或事件的签名。可以在使用接口的类中实现。不能创建对象

了解

编辑:

抽象类中构造函数的用途是什么


当一个类继承另一个类时,必须在对象装箱时首先创建它的父类。在类中,不实现某些特殊构造函数总是使用默认构造函数[className()]。当您重写某个方法时,功能的实现将从重写该方法的类中获取。这就是为什么构造函数中使用的方法永远不应该是虚拟的。抽象类的逻辑相同,这样的类可以有很多功能,并且只有一个方法应该由子类实现

抽象类确实有构造函数。创建派生类的实例时,将调用其父类的构造函数。这也适用于从抽象类派生的类。

抽象类有构造函数,但不能直接调用它们,因为不能直接实例化抽象类

为了回答您的评论,私有抽象方法或属性的概念毫无意义,因为
private
阻止其他人访问它,而
abstract
阻止自己访问它。因此,基本上没有可能的方式来称呼它


编辑:参见Jon Skeet关于私有构造函数的回答。其他类型的私有成员不能存在于抽象类中。

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

下面是一个例子:

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类不能有私有抽象方法,但它们可以有私有构造函数。实际上,在抽象类中只有私有构造函数有时是有用的,因为这意味着该类只能从同一类的程序文本中派生。这允许您创建伪枚举:

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;
        }
    }
}

在这方面,抽象私有方法/属性是有意义的——它可以由基类访问,但由同一类的程序文本中的派生类提供。但是,规范禁止使用。通常,
受保护的
抽象成员会解决相同的问题,但并不总是如此。

好问题。这就是为什么抽象类需要构造函数,即使它们不能实例化

在像C#这样的任何面向对象语言中,对象构造都是一个分层过程。请看下面的代码。当实例化任何类型为DerivedClass的对象时,它必须在创建类型为DerivedClass的对象之前先构造基对象。这里的基类可能是抽象类,也可能不是抽象类。但是,即使在实例化从抽象类派生的具体类型的对象时,它仍然需要在创建DerivedClass类型的对象之前调用基类的构造函数,因此您始终需要抽象类的构造函数。如果尚未添加任何构造函数,C#编译器将自动向生成的MSIL中的类添加公共无参数构造函数

public class BaseClass
{
    public BaseClass() 
    {
        Console.WriteLine("BaseClass constructor called..");
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
        Console.WriteLine("DerivedClass constructor called..");
    }
}

DerivedClass obj = new DerivedClass();

//Output
//BaseClass constructor called..
//DerivedClass constructor called..
PS:假设,如果是抽象基类 不允许有构造函数 因为它们不需要实例化, 对象的全部基本原理 面向对象的编程将继续进行。 抽象类型背后的思想是 表示具有某些属性的对象 特征和行为,但不包括 整体完成,以允许独立 存在


我只是不明白构造函数的用途?抽象类有私有构造函数吗?不,不是私有的-那个修饰符对继承者是不可见的。。。所以它必须至少受到保护,这不是像我这样的新手会知道的+1Ex:Bird将是一个抽象基类,它将为地球上所有鸟类提供鸟类的一般行为,但实际上鸟类对象不能独立存在。Parrot类型或Sparrow类型将从Bird vase抽象类继承,并在指定时表现为具体对象。