2013-11-04 82 views
0

我沒有在此代碼中獲取基類成員。請建議。我在這裏是菜鳥如何在c中繼承隱藏基類成員#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CaseStudy1 
{ 
    class base1 
    { 
     protected string name = ""; 
     public base1() {} 
     public base1(string dad) 
     { 
      this.name = dad; 
     } 
    } 

    class child1 : base1 
    { 
     private string name = ""; 

     public child1() 
     { 
      this.name = base.name; 
     } 

     public void show() 
     { 
      base1 b1 = new base1("Daddy"); 
      Console.WriteLine("base name"+base.name); 
      Console.WriteLine("child's name" + name);    
     } 

     public static void Main(string[] args) 
     { 
      child1 c1 = new child1(); 
      c1.show(); 
      Console.ReadLine(); 
     } 
    } 
+0

你會得到什麼? –

+0

需要關於您的問題的更多解釋。 – Shivaay

+0

你應該嘗試學習更多一點的繼承。你想使用它的方式很奇怪。在你的第一個主線你創建一個子對象,但你不調用它的基礎構造函數...在你的函數顯示你正在創建一個新的基礎實例,但你指的是你的子實例。如果你使用繼承,你創建的對象就是base1和child1。所以不要把它們看作是分開的東西。 –

回答

0

在這裏,您創建BASE1的新實例class.So你不能從設定值不變使用base.name。因爲B1是新實例讀取顯示方法中。

您可以使用如下。

class base1 
    { 
     protected string name { get; set; } 
     public base1() { } 
    } 
    class child1 : base1 
    { 
     private string name = ""; 
     public void show() 
     { 
      base.name = "Daddy"; 
      this.name = base.name; 
      Console.WriteLine("base name" + base.name); 
      Console.WriteLine("child's name" + name); 
     } 
    } 
+0

但是@AndrewCounts指出,這仍然會隱藏基類中的'name'屬性。 'child1'類不應該有一個屬性與其基類中的屬性相同 – rwisch45

2

在C#中繼承,你有什麼「子」級是不是一個真正的孩子(由基礎所擁有),但基本的一個更具體的版本(像足球是一個特定種類的球)。基類和繼承類是相同的實際對象。因此,new關鍵字不合適,因爲您想要的是基類的名稱,而不是新的基礎對象。通過在基類和繼承類中爲一個屬性使用相同的名稱,您將「隱藏」該基類中的屬性,因爲單個對象不能有兩次相同的屬性(在您的示例中,您的對象不能有兩個不同的name。如果你想要做的是讓繼承類知道基的名稱,他們需要不同的屬性。

想到它的最好方法是,如果您使用new來創建一個對象,該對象將有自己的每個屬性和方法以上任何類它的分類,所以child1對象將有child1base1屬性和方法,而是一種新的base1對象只具有base1 PR operties和方法。

作爲副作用,一個child1對象可以在需要base1對象的任何語句中使用,由於child1對象一個base1對象。