2015-09-29 94 views
0

我有以下代碼。父類和子類

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     Employee FTE = new FullTimeEmployee(); 
    } 

} 

public class Employee 
{ 
    public string FirstName; 
    public string LastName; 
    public void PrintFullName() 
    { 
     Console.WriteLine(FirstName + " " + LastName); 
    } 
} 

public class FullTimeEmployee : Employee 
{ 
    public float YearlySalary; 
} 

我只是想澄清一件事。

如果我寫Employee FTE = new FullTimeEmployee();是創建的對象只能訪問FirstName,LastName,PrintFullName和NOT YearlySalary?

如果我寫FullTimeEmployee FTE = new FullTimeEmployee();創建的對象是否能夠訪問所有內容,包括YearlySalary?

感謝

+0

你爲什麼不試試這個呢? –

+0

我只是想確定我是否理解正確。 – jelly

+0

很抱歉讓您困惑,但「創建的對象」在這兩種情況下都是「FullTimeEmployee」。您*將*(引用)賦予一個變量,該變量可以處理「Employee」或「FullTimeEmployee」,具體取決於您如何聲明它。如果將該變量聲明爲「Employee」,則不能通過該變量(直接)訪問該對象的'YearlySalary'字段。但是該領域仍然存在於這個對象上。而且它會像'((FullTimeEmployee)FTL).YearlySalary'來訪問它一樣簡單。 – Corak

回答

2

在任何情況下,對象是FullTimeEmployee,如果你通過new FullTimeEmployee();創建它。但是你沒有隻能訪問聲明類型。因此,如果您聲明它爲:FullTimeEmployee FTE =,則您擁有完全訪問權限,如果您聲明它爲Emplyee FTE則說明您沒有。但是,你可以簡單地將它放回去。

解決方案一:

Employee FTE = new FullTimeEmployee(); 
var employee = (FullTimeEmployee)FTE; 
var sal = employee.YearlySalary; 

解決方法二

Employee FTE = new FullTimeEmployee(); 
var employee = (FTE as FullTimeEmployee) 
var sal = employee.YearlySalary; 

這應該在兩個工作。這兩者之間的區別在於,如果投射失敗,則as不會引發異常,它將僅返回null。

在你的情況下,你可以看看var關鍵字。