2010-09-16 115 views
1

嗨, 我有一個與C#中的OOPS概念相關的小查詢。C#繼承概念建議

我有一個接口

interface intf 
{ 
    string Hello(); 
} 

甲基類

public class BaseClass 
{ 
    public string Hello() 
    { 
     return "Hello of base class called"; 
    } 
} 

一個子類是從BaseClass衍生並實現接口INTF以及

public class ChildClass : BaseClass, intf 
{ 
    string Hello() 
    { 
    return "Hello of child class called"; 
    } 
} 

現在我的問題是,當我創建一個ChildClass對象,然後當我調用hello方法時,它總是調用基類的hello方法。首先,爲什麼它會調用base的Hello,其次,我怎樣才能調用子類的Hello。請指教

private void Form1_Load(object sender, EventArgs e) 
{ 
     ChildClass obj = new ChildClass(); 
     MessageBox.Show(obj.Hello()); 
} 

感謝

+0

爲什麼要在界面上聲明該方法呢?你想達到什麼目的?另外,您是否意識到可以明確實現接口的事實? – 2010-09-16 03:51:38

+0

嗯,我只是想學習conepts和是的,我知道如果我做intf.hello這將調用我的接口方法。感謝您的回覆 – Amit 2010-09-16 03:57:12

回答

3

爲什麼叫你好基地

你的孩子類實現的接口,因此它被認爲含有一個公共你好方法。但是在你的孩子班裏,你好不公開。基類中的Hello方法是公共的,並且被認爲是接口的實現。

如何調用子類

你好充分利用你好在子類中公開。然後它將被考慮到接口的實現。

2

聲明在基類virtual的方法,然後override它的子類。這樣,虛擬調用將解析爲子類而不是父類。

更新: 回答關於爲什麼它仍然基本方法,你在方法聲明中把new即使經過這樣的問題:

默認情況下,類成員是私有的。因此,由於您沒有將該方法標記爲公開,該方法是私人的。因此,程序是強制調用基本方法,因爲它是唯一可訪問的方法。

+1

此外,在子類的方法應該是'公共' – 2010-09-16 03:51:57

+0

埃斯特班,謝謝你的答覆,我同意,當我使用虛擬和覆蓋關鍵字時,它會調用孩子的你好。現在,讓我修改一下代碼,並添加新的關鍵字到我的子類hello鍵,如果我現在檢查它仍然調用base的hello。爲什麼? – Amit 2010-09-16 03:52:38

+0

檢查生成項目時的錯誤和警告。如果你沒有你的'virtual'和'override'關鍵字,你會得到如下警告:''App.ChildClass.Hello()'隱藏繼承的成員'App.BaseClass.Hello()'。新的關鍵字,如果隱藏是打算。「 – Lee 2010-09-16 03:58:54

0

您目前聲明您的方法的方式,ChildClass中的方法Hello()無法訪問,因此調用BaseClass中的公共方法。你真正想要的是Esteban說過的,聲明基本方法public virtual,派生方法public override,否則你的方法只是映射基類方法。

6

首先,您沒有在ChildClass中提供Hello的訪問修飾符。這使得它默認是私有的。要從課程外部訪問該方法,請將其標記爲public(如果使用相同的名稱空間,則將其標記爲internal)。就目前而言,唯一公開可見的方法的基類方法。

其次,一旦你解決了訪問問題,Hello將隱藏該方法在基地。如果這是有意的,最好是用new關鍵字與方法

public new string Hello() 

如果你的目的是隱藏方法,而是要覆蓋它,標誌着在基類中的方法,虛擬和在子中使用override關鍵字。

public class ChildClass : BaseClass, intf 
{ 
    public override string Hello() 
    { 
     return "Hello of child class called"; 
    } 
} 

public class BaseClass 
{ 
    public virtual string Hello() 
    { 
     return "Hello of base class called"; 
    } 
} 

這將讓你始終電話孩子的方法,除非你從孩子中明確調用基方法。

呼叫這樣從外面的世界

((BaseClass)child).Hello(); 
(child as BaseClass).Hello(); 
BaseClass baseClass = new ChildClass(); 
baseClass.Hello(); 

會導致孩子的方法被使用。

呼叫這樣從子類

base.Hello(); 

將導致基類的方法被使用。

0

就像其他人說的那樣,在Child類的public override中設置Hello方法。

另外,恕我直言,你應該在基類中實現接口,而不是子類。但是這與你的方法沒有被調用的事實無關。