我正在撰寫一個程式,它使用一個串列來存盤員工資料,遵循 SOLID 原則,我嘗試將盡可能多的功能從主類中移到他們自己的類中。我有一個存盤庫類,它列出了初始串列值以及包含用于訪問和編輯串列的讀取和創建方法。我的問題是我的新班級無法訪問隨后添加到串列中的任何內容,只能看到啟動時的 intail 資料。
這是我的回購類:
public class Repository
{
private List<EmployeeData> myEmployeeData = new List<EmployeeData>()
{
new EmployeeData()
{
EmployeeID = 1,
FName = "Joe",
LName = "Bloggs",
isPermanent = true,
Salaryint = 40000,
Bonusint = 5000,
DayRateint = null,
WeeksWorkedint = null
},
new EmployeeData()
{
EmployeeID = 2,
FName = "John",
LName = "Smith",
isPermanent = true,
Salaryint = 45000,
Bonusint = 2500,
DayRateint = null,
WeeksWorkedint = null
},
new EmployeeData()
{
EmployeeID = 3,
FName = "Clare",
LName = "Jones",
isPermanent = false,
Salaryint = null,
Bonusint = null,
DayRateint = 350,
WeeksWorkedint = 40
}
};
public EmployeeData Create(int IDcount, string fname, string lname, bool isPerm, int? Salary, int? Bonus, int? DayRate, int? WeeksWorked)
{
var createEmployee = new EmployeeData()
{
EmployeeID = IDcount,
FName = fname,
LName = lname,
isPermanent = isPerm,
Salaryint = Salary,
Bonusint = Bonus,
DayRateint = DayRate,
WeeksWorkedint = WeeksWorked
};
myEmployeeData.Add(createEmployee);
return createEmployee;
}
public IEnumerable<EmployeeData> ReadAll()
{
return (myEmployeeData);
}
public EmployeeData Read(int employeeID)
{
return myEmployeeData[employeeID];
}
public EmployeeData Update(int employeeID, string fname, string lname, bool isPerm, int? Salary, int? Bonus, int? DayRate, int? WeeksWorked)
{
var x = Read(employeeID);
x.FName = fname;
x.LName = lname;
x.isPermanent = isPerm;
x.Salaryint = Salary;
x.Bonusint = Bonus;
x.DayRateint = DayRate;
x.WeeksWorkedint = WeeksWorked;
return x;
}
public bool Delete(int employeeID)
{
myEmployeeData.RemoveAt(employeeID);
return true;
}
}
這是我的新類,它無法訪問新創建的專案:
public class Calculator : Repository
{
public double AnnualPayAfterTax;
public double AnnualPay;
public double CalculateEmployeePay(int employeeID)
{
bool EmploymentStatus = Read(employeeID).isPermanent;
if (EmploymentStatus == true)
{
int Salary = (int)Read(employeeID).Salaryint;
int Bonus = (int)Read(employeeID).Bonusint;
AnnualPay = Salary Bonus;
}
else {
int DayRate = (int)Read(employeeID).DayRateint;
int WeeksWorked = (int)Read(employeeID).WeeksWorkedint;
AnnualPay = (DayRate * 5) WeeksWorked;
}
if (AnnualPay < 12570) { AnnualPayAfterTax = AnnualPay; }
if (AnnualPay > 12570) { AnnualPayAfterTax = (AnnualPay - 12570) * 0.2; }
return (AnnualPayAfterTax);
}
}
這是我的主要方法的一部分,它呼叫兩個類,注意 read() 在這個類中對于新添加的串列項作業正常。
bool CalLoop = false;
while (CalLoop == false)
{
Console.Clear();
Console.WriteLine("CALCULATE ANNUAL PAY\n");
Console.WriteLine(string.Concat(re.ReadAll()));
Console.Write("\nSelect ID of Employee: ");
string Input = Console.ReadLine();
bool valid = int.TryParse(Input, out Output);
if (valid)
{
int selectedID = Output;
selectedID = selectedID - 1;
bool CheckID = (selectedID <= IDcount);
if (CheckID)
{
Console.WriteLine("Employee Name: " re.Read(selectedID).FName " " re.Read(selectedID).LName);
Console.WriteLine("Employment Type: " re.Read(selectedID).isPermanent);
Console.WriteLine("Annual Pay after Tax: £" cal.CalculateEmployeePay(selectedID));
}
else
{
Console.WriteLine("Invaild ID.");
}
}
else
{
Console.WriteLine("Invaild ID.");
}
CalLoop = true;
}
任何想法為什么我的新班級看不到任何新添加到串列中的內容?我認為串列在整個運行時動態更新?我錯過了什么嗎?
感謝任何幫助或評論,所以提前謝謝你!
uj5u.com熱心網友回復:
private List<EmployeeData> myEmployeeData = new List<EmployeeData>()是private... 將其更改為protected以便繼承的類可以訪問它。
uj5u.com熱心網友回復:
你有兩個類:
public class Repository
{
public List<EmployeeData> myEmployeeData = new List<EmployeeData>();
}
public class Calculator : Repository
{ }
當這兩個類被實體化時,您可以看到它不共享相同的串列:
var rep = new Repository();
var cal = new Calculator();
if(object.ReferenceEquals(rep.myEmployeeData, cal.myEmployeeData))
{
Console.WriteLine("Repository and Calucaltor share the same liste.")
}
else
{
Console.WriteLine("Repository and Calucaltor don't share the same liste.")
}
一個類就像一個建造建筑物的計劃。例如,“BaseBuilding”計劃有一個接待處和一個洗手間。以及從計劃“BaseBuilding”擴展(繼承)并添加一些辦公室的計劃“OfficeBuilding”
接下來,按照“BaseBuilding”計劃建造一座建筑物,按照“OfficeBuilding”計劃建造另一棟建筑物。在這種情況下,您建造了兩個接待處和洗手間(一個在建筑物旁邊)。
實體化Repository和時也是如此Calculator。這會創建兩個不同的物件,每個物件都有自己的串列。更多資訊請參見關于繼承的官方檔案;
但這是真正的問題。當從B類A類繼承,那么你可以通過A. subtituate b在你的情況下,Calculator從繼承Repository,那么你就可以subtituateRepository通過Calculator。
I use the repository to read employee's informations.
I use the calculator to read employee's informations.
第一句很清楚,但第二句……聽起來很奇怪。這是因為這違反了第三個 SOLID 原則(Liskov 替換)。
還有為什么計算器可以讀取員工資訊?這是存盤庫檢索員工資訊的責任。計算器應該只做計算。這違反了第一個 SOLID 原則(單一責任)。
如果你想遵循 SOLID 原則,那么我建議你避免繼承并更喜歡組合。
在你的情況下:
class Calculator
{
private readonly Repository _repository;
public Calculator(Repository repository)
{
_repository = repository;
}
public double CalculateEmployeePay(int employeeID)
{
bool EmploymentStatus = _repository.Read(employeeID).isPermanent;
...
}
}
所以計算器只計算,存盤庫只管理員工。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337195.html
下一篇:類實體的出廠重置
