为什么可以在c#中编写抽象类的构造函数? 据我所知,我们不能实例化一个抽象类..那它是干什么用的呢? 你不能实例化类,对吧?
当前回答
从https://msdn.microsoft.com/en-us/library/ms182126.aspx
抽象类型上的构造函数只能由派生类型调用。由于公共构造函数创建类型的实例,而不能创建抽象类型的实例,因此具有公共构造函数的抽象类型是不正确设计的。
由于只有派生类才能使用抽象类构造函数,因此如果需要,必须将抽象类构造函数声明为受保护的。
然而,当在抽象类中声明公共构造函数时,VS编译器不会报错(默认规则),但是它不允许创建一个新实例。
其他回答
通常构造函数涉及初始化正在创建的对象的成员。在继承的概念中,通常继承层次结构中的每个类构造函数都负责实例化自己的成员变量。这是有意义的,因为实例化必须在定义变量的地方进行。
由于抽象类不是完全抽象的(不像接口),它是抽象成员和具体成员的混合,非抽象成员需要初始化,这是在抽象类的构造函数中完成的,因此在抽象类中有必要有构造函数。当然,抽象类的构造函数只能从派生类的构造函数调用。
它的存在是为了执行抽象类的所有实现所需要的一些初始化逻辑,或者在抽象类上实现的任何方法(并不是抽象类上的所有方法都必须是抽象的,有些方法可以实现)。
任何继承自抽象基类的类都必须调用基构造函数。
因为在抽象类中可能有一种标准的方法来实例化数据。这样,就可以让继承自该类的类调用基构造函数。
public abstract class A{
private string data;
protected A(string myString){
data = myString;
}
}
public class B : A {
B(string myString) : base(myString){}
}
据我所知,我们不能实例化一个抽象类
这是你的误差。当然,您可以实例化一个抽象类。
abstract class Animal {}
class Giraffe : Animal {}
...
Animal animal = new Giraffe();
这里有一个动物的例子。通过创建从抽象类派生的具体类来实例化抽象类,然后实例化抽象类。请记住,派生的具体类的实例也是其抽象基类的实例。长颈鹿的实例也是动物的实例,即使动物是抽象的。
假设您可以实例化一个抽象类,它需要像任何其他类一样有一个构造函数,以确保它的不变量得到满足。
静态类是一个你实际上不能实例化的类,你会注意到在静态类中创建实例构造函数是不合法的。
您可以在实现所有方法之后实例化它。然后将调用构造函数。
推荐文章
- 在EF中更新父实体时如何添加/更新子实体
- ASP。NET身份的默认密码散列器-它是如何工作的,它是安全的?
- 如何写一个JSON文件在c# ?
- 静态隐式运算符
- 不区分大小写列表搜索
- 'throw'和'throw new Exception()'的区别
- 不能在lambda表达式中使用ref或out参数
- c# int到字节[]
- 将WPF组合框绑定到自定义列表
- foreach vs somlist . foreach (){}
- 为什么try{…}最后{…}好;尝试{…} catch{}坏?
- c# 8用多种情况切换表达式,结果相同
- 在没有事件源注册的情况下写入Windows应用程序事件日志
- 并发HashSet<T>在。net框架?
- 从控制器内获得控制器和动作名称?