C#继承,添加新方法

时间:2013-05-08 15:12:39

标签: c# inheritance virtual

好的,所以我一直在寻找一段时间试图找到这个问题的答案,但很难说出来,所以我在这里问。

我正在继承一个类

Class A (int a, int b, int c)

public A(int a, int b, int c)
{
}

Class B : A 

public B(int a, int b, int c) base: (a, b, c)

public void blah(int something)
{

}

为什么我不能这样做然后呢:

B classb = new B(1,2,3);

classb.blah(4);

相反,我必须做

public virtual void blah(int something)
{
}  

在A班,然后在B班:

public override void blah(int something)
{
 //method to be used in B but not A.
}

所以,即使我无意在A类中使用该方法,我还是要声明虚拟?所以如果我继承C:B那么什么呢?我必须在A中为C声明东西吗?

4 个答案:

答案 0 :(得分:2)

  

为什么我不能这样做然后呢:

B classb = new B(1,2,3);

classb.blah(4);

你绝对可以。除了代码中的语法错误之外,完全没有问题。这是一个完整的例子,编译和运行没有问题。 (我已经为blah方法同时修复了命名约定违规。)

using System;

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A
{
    public B(int a, int b, int c) : base(a, b, c)
    {
    }

    public void Blah(int something)
    {
        Console.WriteLine("B.Blah");
    }
}



class Test
{
    static void Main()
    {
        B b = new B(1, 2, 3);
        b.Blah(10);
    }
}

答案 1 :(得分:1)

你的假设没有任何意义,至少和我理解的一样多。

请考虑以下示例:

public class Base {}

public class Derived : Base {
    public void DerivedSpecificMethod() {
    }
}

如果你这样做

Derived d = new Derived(); //as you specify in code example 
d.DerivedSpecificMethod(); //you CAN do this.

如果你写的话可能需要virtual

Base b = new Derived(); //note, I use a Base here on left side of equation
b.DerivedSpecificVirtualMethod(); //virtual method call

答案 2 :(得分:1)

除此之外,您的代码实际上并不是有效的C#,这没有任何问题。我想这就是你想要的:

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A 
{
    public B(int a, int b, int c) : base(a, b, c)
    {
    }

    public void blah(int something)
    {
    }
}

然后这没问题:

B classb = new B(1,2,3);
classb.blah(4);

答案 3 :(得分:0)

您的代码无法编译。您不必使用virtual说明符,这可以按预期工作:

class App
{
    static void Main()
    {
        B classb = new B(1,2,3);
        classb.blah(4);
    }
}

class A
{
    public A(int a, int b, int c)
    {
    }
}

class B : A 
{
    public B(int a, int b, int c): base (a, b, c)
    {
    }

    public void blah(int something)
    {
        Console.WriteLine(something);
    }
}