基类中的基础构造函数而不是C#中的派生类

时间:2012-12-10 13:56:45

标签: c# constructor abstract-class

我正在学习如何在C#中正确应用OO原则。我遇到了一个小问题,我无法弄清楚如何解决它。我遇到了以下问题:

目前情况:

public abstract class Foo
{
    protected Foo()
    {
        //does nothing
    }
}

public class Bar : Foo
{
    public BarX ( int a, int b, int c) : base()
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public doStuff()
    {
        //does stuff
    }
}

public class BarY : Foo
{
    public Bar( int a, int b, int c) : base()
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public doStuff()
    {
        //does stuff
    }
}

关键是我有不同类型的Foo。在这种情况下,它将是圆形和矩形。我希望它们具有相同的构造函数,因为每种类型具有相同的属性。它们只有不同的doStuff()方法。我尝试了很多组合,但每次我尝试将参数移动到基类的构造函数时,它告诉我'某些类不包含一个带0参数的构造函数'(或3个参数),这取决于我如何移动我的代码。 / p>

我的问题是如何将a,b和c的值赋值给抽象类的构造函数?

2 个答案:

答案 0 :(得分:1)

以下内容可行:

public abstract class Foo
{
    protected Foo(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public abstract void doStuff();
}

public class Bar : Foo
{
    public Bar(int a, int b, int c) : base(a, b, c)
    {
    }

    public override void doStuff()
    {
        //does stuff
    }
}


public class BarY : Foo
{
    public BarY(int a, int b, int c) : base(a, b, c)
    {
    }

    public override void doStuff()
    {
        //does stuff
    }
}

答案 1 :(得分:1)

那是因为BarYBarX正在调用默认构造函数(base()),当您只有参数化构造函数时,它不存在于您的基类中。您还需要传递参数(base(a, b, c)):

public abstract class Foo
{
    protected Foo(int a, int b, int c) 
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public abstract void doStuff();
}

public class Bar : Foo
{
    public BarX (int a, int b, int c) : base(a, b, c)
    {

    }

    public override void doStuff()
    {
        //does stuff
    }
}

public class BarY : Foo
{
    public Bar(int a, int b, int c) : base(a, b, c)
    {

    }

    public override void doStuff()
    {
        //does stuff
    }
}