2013-05-08 57 views
-7

好吧,所以我一直在寻找一段时间试图找到这个问题的一个问题,但它很难说,所以我在这里问。C#继承,添加新方法

我继承一个类像

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,那又怎么样?我必须在C中声明A的东西吗?

+0

我敢肯定,你可以。你确定你发布了正确的代码吗? – 2013-05-08 15:15:01

+3

您粘贴的代码甚至不是接近有效的C#。目前还不清楚它想传达什么。请修复您的示例代码。 – cdhowie 2013-05-08 15:15:26

+0

修正了它,当我看到tigrans响应。在我的代码中,我实际上并没有使用这些特定的类名或方法名,我只是输入了一些近似于我正在做的事情。 – Tim 2013-05-08 15:33:45

回答

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 
+0

我的问题是我在做classb = new B(1,2,3) – Tim 2013-05-08 15:26:55

+0

@Tim:是的,在这种情况下,您可能需要虚拟关键字才能使其工作。 – Tigran 2013-05-08 15:37:46

+0

@Tim你也可以做一个'A classb = new B(1,2,3); ((b)中ClassB的).blah();'。然而,这表明你要么在转换前检查类型,要么不必要地将变量声明为基类型。 – 2013-05-08 15:50:57

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); 
    } 
} 
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

有没有错的,但您的代码实际上并不是有效的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);