2013-05-08 60 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);