为什么可以在c#中编写抽象类的构造函数? 据我所知,我们不能实例化一个抽象类..那它是干什么用的呢? 你不能实例化类,对吧?
当前回答
你完全正确。我们不能实例化一个抽象类,因为抽象方法没有任何主体,即抽象方法不可能实现。但在某些情况下,你可能需要初始化基类的一些变量。 你可以通过使用@Rodrick建议的base关键字来做到这一点。在这种情况下,我们需要在抽象类中使用构造函数。
其他回答
这是一种强制抽象类的一组不变量的方法。也就是说,无论子类做什么,你都想确保基类的某些事情总是正确的……例子:
abstract class Foo
{
public DateTime TimeCreated {get; private set;}
protected Foo()
{
this.TimeCreated = DateTime.Now;
}
}
abstract class Bar : Foo
{
public Bar() : base() //Bar's constructor's must call Foo's parameterless constructor.
{ }
}
不要把构造函数看作new操作符的对偶。构造函数的唯一目的是在开始使用对象之前确保对象处于有效状态。只是我们通常通过一个新的运算符来调用它。
据我所知,我们不能实例化一个抽象类
这是你的误差。当然,您可以实例化一个抽象类。
abstract class Animal {}
class Giraffe : Animal {}
...
Animal animal = new Giraffe();
这里有一个动物的例子。通过创建从抽象类派生的具体类来实例化抽象类,然后实例化抽象类。请记住,派生的具体类的实例也是其抽象基类的实例。长颈鹿的实例也是动物的实例,即使动物是抽象的。
假设您可以实例化一个抽象类,它需要像任何其他类一样有一个构造函数,以确保它的不变量得到满足。
静态类是一个你实际上不能实例化的类,你会注意到在静态类中创建实例构造函数是不合法的。
关于抽象类的要点
抽象类不能被实例化。 抽象类可以有构造函数和析构函数。 抽象类不能是密封类,因为密封 修饰符阻止类被继承。 抽象类包含抽象成员和非抽象成员。 抽象类成员可以是私有的、受保护的和内部的。 抽象成员不能拥有私有访问修饰符。 抽象成员是隐式的虚成员,必须由 非抽象派生类。
从https://msdn.microsoft.com/en-us/library/ms182126.aspx
抽象类型上的构造函数只能由派生类型调用。由于公共构造函数创建类型的实例,而不能创建抽象类型的实例,因此具有公共构造函数的抽象类型是不正确设计的。
由于只有派生类才能使用抽象类构造函数,因此如果需要,必须将抽象类构造函数声明为受保护的。
然而,当在抽象类中声明公共构造函数时,VS编译器不会报错(默认规则),但是它不允许创建一个新实例。
我也想在抽象的表面上发光 所有的答案几乎涵盖了所有的事情。还是我的小钱
抽象类是有一些例外的普通类
该类的任何客户端/消费者都不能创建该类的对象 类,这并不意味着它的构造函数永远不会调用。它的派生类可以选择调用哪个构造函数。(如某些回答所描述) 它可能具有抽象的功能。
推荐文章
- HTTP POST返回错误:417“期望失败。”
- 如何在。net中创建和使用资源
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- 如何在c#中获得正确的时间戳
- Linq选择列表中存在的对象(A,B,C)
- c# .NET中的App.config是什么?如何使用它?
- c#:如何获得一个字符串的第一个字符?
- String类中的什么方法只返回前N个字符?
- 更好的方法将对象转换为int类型
- 我可以将c#字符串值转换为转义字符串文字吗?
- 在c#中转换char到int
- c#中朋友的对等物是什么?
- 关键字使用virtual+override vs. new
- 在ASP中选择Tag Helper。NET Core MVC
- 如何在没有任何错误或警告的情况下找到构建失败的原因