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