创建新对象时覆盖

时间:2012-09-06 08:51:28

标签: c# .net

我可以在C#中做这样的事情吗?

Calculator calculator = new Calculator()
{
    protected override int ValueOfK() 
    {
        return 1;
    }
};

如果是这样,你是怎么做到的?

3 个答案:

答案 0 :(得分:3)

为了覆盖方法,您需要继承Calculator并覆盖继承类中的ValueOfK方法(前提是它在virtual中声明为Calculator )。

没有其他机制可以覆盖C#中的方法。

public Calculator
{
    protected virtual int ValueOfK() 
    {
        return 2;
    }
}

public NewKCalculator : Calculator
{
    protected override int ValueOfK() 
    {
        return 1;
    }
}

答案 1 :(得分:2)

不,这不是JavaScript。您无法在运行时方法附加到已定义的类型。

您可以使用DynamicObjectC#中实现类似功能。 但是,基本上,我建议避免这种情况。修改架构,然后利用动态的东西,如果它自然可能的话,它会更好。让我们继续受益于静态类型语言的优点。

答案 2 :(得分:0)

您可以使用扩展方法(编辑:如果Calculator未实现ValueOfK())(更多信息:MSDN

 Calculator calc = new Calculator();
 int val=calc.ValueOfK();

扩展:

public static class MyExtension
{
    public static int ValueOfK(this Calculator calc)
    {
        return 1;
    }
}

修改

除非提及 Oded ,否则您需要继承Calculator并覆盖ValueOfK。如果方法为non-virtualstatic,则需要使用new关键字:

public class Calculator
{
    protected int ValueOfK()
    {
        return 0;
    }
}

public class BetterCalculator : Calculator
{
    protected new int ValueOfK()
    {
        return 1;
    }
}