C# 和 OOP 編程的新手。我了解繼承部分等。
我堅持的(對于一個小型學校專案)如下:
- 我有一個班級叫做團隊
- 我有一個名為 TeamMember 的基類
- 我有 3 個從 TeamMember 繼承的類(更具體的團隊角色)
- 每個團隊只能有一定數量的團隊成員(即每個團隊 10 個團隊成員)
團隊不繼承任何其他類,但(在現實世界中)一個團隊確實有團隊成員(否則當然沒有團隊)。
在 Team 和 TeamMember(或更具體的角色)之間建立聯系以便 1 個 Team 實體在其中包含 10 個 TeamMember 實體的正確方法是什么?
這可以通過陣列實作嗎?如果是這樣,我在哪個類中初始化這個陣列以及如何用正確的物件填充它?
(如果我的術語沒有達到應有的水平,請原諒我。還在那里學習,所以如果我可以在某處改進它,請糾正我,我會編輯它)
uj5u.com熱心網友回復:
我對 OOP 并不陌生,但我不是一個非常聰明的開發人員。這很有趣,它是關于您如何設計 TeamMember 的孩子的 3 個班級。
我建議您將每種型別的 TeamMembers 封裝在 Team 類中。嘗試想象一下,您的團隊中將有很多 ppl,然后是關于如何設計團隊中 ppl 的層次結構。在我的情況下,我將成員分為 3 個 TeamMember 的孩子串列。每個類都有特殊的屬性,即 prop1、prop2、prop3(當您考慮 OOP 時,您將不得不考慮要重用什么,為不同類的每個成員提供的不同欄位/方法是什么)。
例如
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine("Hello, world!");
Team t =new Team();
t.AddTeamMember( new TeamMembers_Child1(){ name ="n1" ,prop1 ="I'm a staff" } );
t.AddTeamMember( new TeamMembers_Child2(){ name ="n2" ,prop2 ="I'm a manager" } );
t.AddTeamMember( new TeamMembers_Child3(){ name ="n3" ,prop3 ="I'm a janitor" } );
t.AddTeamMember( new TeamMembers_Child2(){ name ="n4" ,prop2 ="I'm an imposter " } );
}
}
public class TeamMember{
public string name {get;set;}
}
public class TeamMembers_Child1 : TeamMember{
public string prop1 {get;set;}
}
public class TeamMembers_Child2 : TeamMember{
public string prop2 {get;set;}
}
public class TeamMembers_Child3 : TeamMember{
public string prop3 {get;set;}
}
public class Team{
private List<TeamMembers_Child1> _member_role1;
private List<TeamMembers_Child2> _member_role2;
private List<TeamMembers_Child3> _member_role3;
public Team(){
_member_role1 = new List<TeamMembers_Child1>();
_member_role2 = new List<TeamMembers_Child2>();
_member_role3 = new List<TeamMembers_Child3>();
}
/* as Andrei Dragotoniu 's answer the logic of Adding member will be in this function like team only have 2 manager , etc.*/
public void AddTeamMember(TeamMember newTeamMember)
{
if (newTeamMember == null) return;
else if (this._member_role1.Count this._member_role2.Count this._member_role3.Count < 10){
if( newTeamMember is TeamMembers_Child1)
{
this._member_role1.Add( ( TeamMembers_Child1 )newTeamMember);
Console.WriteLine("Add role1");
}else if( newTeamMember is TeamMembers_Child2)
{
this._member_role2.Add(( TeamMembers_Child2 )newTeamMember);
Console.WriteLine("Add role2");
} else if( newTeamMember is TeamMembers_Child3)
{
this._member_role3.Add(( TeamMembers_Child3 )newTeamMember);
Console.WriteLine("Add role3");
}
}
}
}
}
result
> Hello, world!
> Add role1
> Add role2
> Add role3
> Add role2
uj5u.com熱心網友回復:
一個很好的方法是做這樣的事情:
public class Team
{
private List<TeamMember> _teamMembers;
public Team()
{
this._teamMembers = new List<TeamMember>();
}
public void AddTeamMember(TeamMember newTeamMember)
{
if (newTeamMember == null) return;
if (this._teamMembers.Count < 10)
this._teamMembers.Add(newTeamMember);
}
}
那么,我們這里有什么?
我沒有使用設定長度的陣列然后依賴例外,而是介紹了一種控制團隊成員的簡單方法。
該類屬性是私有的,因此您不能直接向其添加任何內容。
相反,我創建了一個公共方法,它公開了一種將成員添加到所述串列的方法,這是我們控制可以添加的團隊成員數量的地方。
我喜歡在建構式中實體化串列屬性,因此當您使用該類時,您無需檢查該串列是否存在,而是在創建 Team 實體后立即將其初始化為空串列,然后不用擔心的一件事。
然后我們可以做出更多的設計決策,也許我們希望該方法回傳一個布爾結果,如果有人添加,則為 true,如果沒有,則為 false,因為我們已經有 10 個。
現在,您說 TeamMember 是其他類的基類。這意味著您可以將所有這些類傳遞給您的團隊。
假設你有這樣的事情:
public class SomeMember : TeamMember
{
}
您仍然可以像這樣將其添加到您的串列中:
var team = new Team();
var someMember = new SomeMember();
team.AddTeamMember(someMember);
代碼之所以有效,是因為它基于基類,并且是一種常見的做事方式。例如,如果您有一個界面,它也可以作業。
然而,要記住的一件事是,如果你做這樣的事情,那么你將無法訪問其他類提供的任何額外的東西,除非你將它們從基類轉換回實作類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391713.html
上一篇:回圈遍歷Python類中的函式
