阿摩線上測驗 登入

申論題資訊

試卷:111年 - 111 普通考試_資訊處理:程式設計概要#109801
科目:程式設計
年份:111年
排序:0

題組內容

五、以下二小題是完整的物件導向程式碼,請回答以下各小題。

申論題內容

(二)以下為 C#的類別程式碼,類別 Employee 內的欄位不可以由非繼承的類別讀取或寫入,請檢視此程式是否可以正確執行?若無法正確執行的話,請寫出正確的程式碼。

詳解 (共 2 筆)

詳解 提供者:WJ

應該會出現錯誤
private成員變數並不能被子類別存取

修正:
1.可以將private修正成protected就好
2. 修改employee的建構子,做初始化,在Staff類別的建構子中呼叫super()帶參數

詳解 提供者:hchungw

根據圖片中顯示的C#代碼,Employee 是一個抽象類別,它有三個私有欄位:id、name和age。Staff 類別繼承自 Employee 並在其構造函數中嘗試直接訪問這些私有欄位。
在C#中,私有欄位只能被其所在的類別的方法直接訪問。因此,即使是衍生類別(子類別),也無法直接訪問父類別的私有成員。這導致在 Staff 類別的構造函數中對 this.id、this.name 和 this.age 的賦值操作是非法的,將導致編譯錯誤。
要修復這個問題,可以通過以下方法:
在 Employee 類別中提供受保護的(protected)或公開的(public)屬性或方法來訪問這些私有欄位。
修改欄位的可訪問性,將 private 改為 protected,使得在繼承的類別中可以訪問它們。
以下是根據第二種方法修改後的程式碼:
csharp
Copy code
public abstract class Employee
{
    protected string id;
    protected string name;
    protected int age;
    public Employee() { }
}
public class Staff : Employee
{
    public Staff(string _id, string _name, int _age)
    {
        this.id = _id;
        this.name = _name;
        this.age = _age;
    }
}
在這個修訂版本中,我將 Employee 類別中的 id、name 和 age 欄位的訪問修飾符從 private 更改為 protected。這樣 Staff 類別(作為子類別)就能合法地訪問這些欄位了。