当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能在抽象C#类上创建抽象构造函数?

如何解决《为什么我不能在抽象C#类上创建抽象构造函数?》经验,为你挑选了4个好方法。

我正在创建一个抽象类.我希望每个派生类都被强制实现构造函数的特定签名.因此,我做了我想做的事情,我想强制他们实现一个方法,我做了一个抽象的方法.

public abstract class A
{
    abstract A(int a, int b);
}

但是我收到一条消息,说明这个项目的抽象修饰符无效.我的目标是强制这样的代码.

public class B : A
{
    public B(int a, int b) : base(a, b)
    {
        //Some other awesome code.
    }
}

这是所有C#.NET代码.谁能帮我吗?

更新1

我想补充一些东西.我最终得到的是这个.

private A() { }

protected A(int a, int b)
{
    //Code
}

这就是一些人所说的,默认是私有的,并且类需要实现构造函数.但是,这不会强制带有签名A(int a,int b)的构造函数.

public abstract class A
{
    protected abstract A(int a, int b)
    {


    }
}

更新2

我应该清楚,为了解决这个问题,我将默认构造函数设为私有,并保护我的其他构造函数.我并不是在寻找一种让我的代码工作的方法.我照顾好了.我想了解为什么C#不允许你这样做.



1> Tamas Czineg..:

您不能拥有抽象构造函数,因为抽象意味着您必须在任何非抽象子类中覆盖它,并且您不能覆盖构造函数.

如果你考虑一下,这是有道理的,因为你总是调用子类的构造函数(使用new运算符)而不是基类.

一般来说,C#中强制执行特定构造函数签名的唯一方法是使用new()泛型约束,该约束强制存在type参数的无参数构造函数.



2> Jamie Penney..:

将A类中的构造函数更改为

protected A(int a, int b)
{
    // Some initialisation code here
}

然后你的子类必须使用它,因为没有默认的构造函数.

但是,它们仍然可以更改构造函数的实际签名.据我所知,没有办法强制子类为其构造函数使用特定的签名.我很确定构造函数不能是抽象的.

你到底需要什么?我们或许可以建议解决这个问题.


仍然是正确的.调整你想要的东西;)

3> John Saunder..:

虽然您不能覆盖构造函数,因此无法定义抽象构造函数,但您可以在抽象基类中放置抽象工厂方法.所有派生类都需要覆盖它.

public abstract class A 
{ 
    abstract A MakeAInstance(int a, int b); 
} 

public class B : A 
{ 
    // Must implement:
    override A MakeAInstance(int a, int b) {
        // Awesome way to create a B instance goes here
    }
} 


但在这种情况下,您必须首先创建一个B类实例,以便能够调用MakeAInstance方法并获取一个新方法

4> 小智..:

多种原因:

1)构造函数不是继承的,因此您无法覆盖它们.

2)构造函数是一个静态成员函数,因为它不需要调用特定的实例.Abstract暗示"虚拟",这意味着实现可以根据特定实例的子类化方式而有所不同,这与"static"关键字含义的意图相反.


我不同意您的构造函数声明是静态成员,它确实需要调用实例(因为您可以访问实例方法,字段等)。“ new”关键字实例化对象,然后调用构造函数,构造函数本身并不“构造”该对象。
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有