为什么可以在c#中编写抽象类的构造函数? 据我所知,我们不能实例化一个抽象类..那它是干什么用的呢? 你不能实例化类,对吧?
当前回答
您可以在实现所有方法之后实例化它。然后将调用构造函数。
其他回答
据我所知,我们不能实例化一个抽象类
这是你的误差。当然,您可以实例化一个抽象类。
abstract class Animal {}
class Giraffe : Animal {}
...
Animal animal = new Giraffe();
这里有一个动物的例子。通过创建从抽象类派生的具体类来实例化抽象类,然后实例化抽象类。请记住,派生的具体类的实例也是其抽象基类的实例。长颈鹿的实例也是动物的实例,即使动物是抽象的。
假设您可以实例化一个抽象类,它需要像任何其他类一样有一个构造函数,以确保它的不变量得到满足。
静态类是一个你实际上不能实例化的类,你会注意到在静态类中创建实例构造函数是不合法的。
它的存在是为了执行抽象类的所有实现所需要的一些初始化逻辑,或者在抽象类上实现的任何方法(并不是抽象类上的所有方法都必须是抽象的,有些方法可以实现)。
任何继承自抽象基类的类都必须调用基构造函数。
从https://msdn.microsoft.com/en-us/library/ms182126.aspx
抽象类型上的构造函数只能由派生类型调用。由于公共构造函数创建类型的实例,而不能创建抽象类型的实例,因此具有公共构造函数的抽象类型是不正确设计的。
由于只有派生类才能使用抽象类构造函数,因此如果需要,必须将抽象类构造函数声明为受保护的。
然而,当在抽象类中声明公共构造函数时,VS编译器不会报错(默认规则),但是它不允许创建一个新实例。
我也想在抽象的表面上发光 所有的答案几乎涵盖了所有的事情。还是我的小钱
抽象类是有一些例外的普通类
该类的任何客户端/消费者都不能创建该类的对象 类,这并不意味着它的构造函数永远不会调用。它的派生类可以选择调用哪个构造函数。(如某些回答所描述) 它可能具有抽象的功能。
这是一种强制抽象类的一组不变量的方法。也就是说,无论子类做什么,你都想确保基类的某些事情总是正确的……例子:
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操作符的对偶。构造函数的唯一目的是在开始使用对象之前确保对象处于有效状态。只是我们通常通过一个新的运算符来调用它。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和