2015-11-12 83 views
0

我在OOP相當新,似乎每天我都在努力學習它。我和我的團隊目前正在C#Winforms中開發一個相當大的桌面應用程序開發工具。頂級類Instantiation

我從我的國際同行收到該項目在3層應用程序的結構:

  • 數據層
  • GUI

到目前爲止好,事情是在域層我有以下類。

-User.cs -UserBase.cs

的User.cs的結構是這樣的:

/// <summary> 
/// Top-level user class. 
/// </summary> 
public class User 
{ 
    public User() 
    { 
     userBase = new UserBase(); 
    } 

    public IAdmUser userBase { get; set; } 
    public IEnumerable<IAdmGroup> AssGroups { get; set; } 

} 

而且UserBase.cs的結構是這樣的:

public class UserBase:ObjectBase, IAdmUser 
{ 
    /// <summary> 
    /// The date that the user has been registered. The datetime is in UTC format. 
    /// </summary> 
    public DateTime RegistrationDate { get; set; } 

    /// <summary> 
    /// 0 = User is not Active, 1 = User is Active. 
    /// </summary> 
    public bool IsActive { get; set; } 

    /// <summary> 
    /// The username. 
    /// </summary> 
    public string UserName { get; set; } 

    /// <summary> 
    /// Description of the user. 
    /// </summary> 
    public string Description { get; set; } 

    /// <summary> 
    /// Firstname of the user. 
    /// </summary> 
    public string FirstName { get; set; } 

    /// <summary> 
    /// Lastname of the user. 
    /// </summary> 
    public string LastName { get; set; } 
} 

每次我必須使用屬性來填充類型的新對象時,用戶必須按以下方式實例化它:

var newUser = new User 
     { 
      userBase = 
      { 
       FirstName = "name1", 
       LastName = "name2", 
       Description = "Junior Developer", 
       IsActive = true, 
       State = ObjectState.Added, 
       RegistrationDate = DateTime.Now, 
       UserName = "ASD" 
      } 
     }; 

OR

// without object initializer 
var newUser = new User() 
newUser.userBase.PropertyName = "Assign property value" 

所以基本上,如果我只是做:var user = new User(),我不會有機會到田間地頭FirstName, LastName等我走下來像newUser.userBase.PropertyName的水平。

我不明白這是什麼UserBase.cs,我有一個預感的唯一的事情是User.cs只是UserBase.cs的容器。

我在這裏請求幫助,因爲開發這個「框架」的同事有一些問題,他沒有工作。

謝謝你,對不起,如果這會變成一個重複的帖子,說實話,我甚至不知道該問什麼。

+0

在我看來,好像筆者不明白在C#中繼承得很好,當第一次寫這個代碼,或有一個原因,不允許用戶從用戶基礎繼承...無論哪種方式,你必須等到你的同事回來工作或詢問你周圍的人 – Sayse

+0

如果用戶「是」的用戶羣。使用'User:UserBase'。如果用戶「有」用戶羣,那麼您的實施應該沒問題。可能是你需要一個設計模式,爲你填充屬性。 –

+0

在構造函數中擁有userBase = new UserBase()是一個相當大的問題。這只是無稽之談,它什麼都不構成。沒有出現在工作中的建築師應該很擔心你。 *有人*應該說「高停止!」在它陷入項目災難之前。我們不能爲你說,與團隊成員和主管交談。 –

回答

0

看起來這個框架是設計時考慮到了構圖。意思是說,一個User對象是由各種項目組成

在DB層,它可能可能是的情況下,你有2代表的地方:

  • 一個用於UserBase數據,其中包含有關用戶和他們的帳戶信息。
  • 一個用於IAdmGroup,它似乎是用戶所屬的組的集合。

雙方的信息,可能是整理和返回從數據層中的一個對象,因爲在一天結束的時候,域和GUI 不在乎它是如何存儲,從而基本上,一個User對象將具有用戶信息以及它可能屬於的任何組。

爲了解決初始化問題,您可以查看Factory設計模式。這些模式的目標是抽象出對象的初始化,因此您只需傳遞一系列參數,然後由工廠來初始化對象。

除了隱藏初始化細節之外,該模式還允許您在對象初始化時具有一定程度的靈活性,因爲您可以插入可以初始化不同對象的不同工廠。

因此,您的代碼會是這個樣子:

public static class UserFactory 
{ 
    public static User CreateActiveJuniorDeveloper(string firstName, string lastName, string userName) 
    { 
     var newUser = new User 
      { 
       userBase = 
       { 
        FirstName = firstName, 
        LastName = lasteName, 
        Description = "Junior Developer", 
        IsActive = true, 
        State = ObjectState.Added, 
        RegistrationDate = DateTime.Now, 
        UserName = userName 
       } 

       AssGroups = Enumerable.empty<IAdmGroup>(); 
      }; 

     return newUser; 
    } 
} 

... 

User developerUser = UserFactory.CreateActiveJuniorDeveloper("name1", "name2", "ASD"); 
0

User類需要從用戶羣繼承,像這樣:

public class User : UserBase 

在此之後,您可以訪問「可繼承的財產來自UserBase類,就像它們是User類的一部分一樣。

因此,而不是設置:

User.UserBase.FirstName = "name1"; 

您可以使用:

User.FirstName = "name1"; 
+0

所以,我還在爲此而苦苦掙扎,今天與我的上司的電話並不好。他表示,建築師至少2周內不會上班。 *喜極而泣*。 – darksleep

+0

您是否嘗試從基類繼承,如我所示? –

+0

還沒有。但每個人都說'User'必須從'UserBase'繼承。 – darksleep