-7

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

我继承了一个类

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.
}

所以即使我不打算在 AI 类中使用该方法,仍然必须声明虚拟?所以如果我继承类 C : B 那么呢?我必须在 A 中为 C 声明东西吗?

4

4 回答 4

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);
    }
}
于 2013-05-08T15:16:34.410 回答
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
于 2013-05-08T15:16:40.297 回答
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);
于 2013-05-08T15:17:20.447 回答
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);
    }
}
于 2013-05-08T15:15:21.357 回答