首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中抽象类的构造函数

C#中抽象类的构造函数
EN

Stack Overflow用户
提问于 2011-04-09 07:32:11
回答 13查看 207.7K关注 0票数 235

为什么可以在C#中为抽象类编写构造函数?

据我所知,我们不能实例化一个抽象类..那么它是用来做什么的呢?

你不能实例化这个类,对吧?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2011-04-09 07:33:24

因为可能有一种标准的方法来实例化抽象类中的数据。这样,您就可以让从该类继承的类调用基构造器。

代码语言:javascript
复制
public abstract class A{

    private string data;

    protected A(string myString){
      data = myString;
    }

}

public class B : A {

     B(string myString) : base(myString){}

}
票数 307
EN

Stack Overflow用户

发布于 2011-04-09 09:25:11

据我所知,我们不能实例化一个抽象类

这就是你的错误所在。

当然,您可以实例化一个抽象类。

代码语言:javascript
复制
abstract class Animal {}
class Giraffe : Animal {}
...
Animal animal = new Giraffe();

这里有一个Animal的实例。通过从抽象类派生一个具体类并实例化它,可以实例化一个抽象类。请记住,派生的具体类的实例是

还有

其抽象基类的实例。

长颈鹿的实例也是动物的实例,即使动物是抽象的。

假设您可以实例化一个抽象类,那么它需要像任何其他类一样拥有一个构造函数,以确保满足其不变量。

现在,一个静态类实际上是不能实例化的类,您会注意到在静态类中创建实例构造函数是不合法的。

票数 272
EN

Stack Overflow用户

发布于 2011-04-09 07:34:43

这是一种强制执行抽象类的一组不变量的方法。也就是说,无论子类做什么,您都要确保基类的某些内容总是正确的……示例:

代码语言:javascript
复制
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运算符。构造函数的唯一目的是确保您在开始使用对象之前拥有一个处于有效状态的对象。只是碰巧我们

通常通过new运算符。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5601777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档