2008-11-27 54 views
1

我想創建可維護的代碼,但這種繼承情況正在導致我的問題。繼承的類泥潭,如何使這個可維護的代碼

問題是我的第二個數據庫輔助類名爲InitUserExtension

由於UserExtension從用戶繼承,我必須確保我鏡像我的InitUser助手任何更改到InitUserExtension。

我真的不喜歡這個,因爲它容易出錯,有什麼解決方法?

我的類定義:

public class User 
{ 
    public string Name {get; set; } 
    public string Age { get; set; } 
} 

public class UserExtension : User 
{ 
    public string Lastname {get; set; } 
     public string Password {get; set; } 

} 

我的數據庫助手:

public static SqlDataReader InitUser(SqlDataReader dr) 
{ 
     User user = new User(); 

     user.Name = Convert.ToString(dr["name"]); 
     user.Age ... 
} 


public static SqlDataReader InitUserExtension(SqlDataReader dr) 
{ 
     UserExtension user = new UserExtension(); 


     // note: mirror attributes from User 
     user.Name = Convert.ToString(dr["name"]); 
     user.Age ... 



     user.Lastname = Convert.ToString(dr["lastname"]); 
     user.Password = ....; 
} 

回答

2

如何將Name等的處理移動到方法中(接受User或T:User),然後從兩者中調用它?

private static void InitUser(User user, SqlDataReader dr) 
{ // could also use an interface here, or generics with T : User 
    user.Name = Convert.ToString(dr["name"]); 
    user.Age ... 
} 


public static User InitUser(SqlDataReader dr) 
{ 
    User user = new User(); 
    InitUser(user, dr); 
    return user; 
} 

public static UserExtension InitUserExtension(SqlDataReader dr) 
{ 
    UserExtension user = new UserExtension(); 
    InitUser(user, dr); 
    user.Lastname = Convert.ToString(dr["lastname"]); 
    user.Password = ....; 
    return user; 
} 

作爲替代方案,您可以減少行數,但增加了複雜性,使用泛型:

private static T InitUserCore<T>(SqlDataReader dr) where T : User, new() 
{ 
    T user = new T(); 
    // ... 
    return user; 
} 
public static User InitUser(SqlDataReader dr) 
{ 
    return InitUserCore<User>(dr); 
} 
public static UserExtension InitUserExtension(SqlDataReader dr) 
{ 
    UserExtension user = InitUserCore<UserExtension>(dr); 
    // ... 
    return user; 
} 
+0

我有一個parseRow 方法,那麼我可以告訴它我想它要創建的對象,並賦值(從讀者或tablerow的) – 2008-11-27 14:52:30

+0

@Andrew Bullock - 就像我剛剛添加的編輯一樣? – 2008-11-27 14:57:20

1

你爲什麼不打電話從InitUserExtension方法InitUser。讓基本初始化處理基類屬性,並讓擴展初始化程序處理擴展類屬性。

0

我不知道你爲什麼不放在類中的分配代碼本身,但它可能與你如何讓存儲它的信息做...

我的解決辦法是重寫它是這樣的:

public class User 
{ 
    public string Name {get; set; } 
    public string Age { get; set; } 

    public User(DataReader dr) 
    { 
     user.Name = Convert.ToString(dr["name"]); 
     user.Age ... 
    } 
} 

public class UserExtension : User 
{ 
    public string Lastname {get; set; } 
    public string Password {get; set; } 

    public UserExtension(DataReader dr):base(dr) 
    { 
     user.Lastname = Convert.ToString(dr["lastname"]); 
     user.Password = ....; 

    } 
} 

Milage可能因你的情況

這樣一來,像

var MyExtension = new UserExtension(dr); 

通話將適當地填寫所有字段。

1

如果你不喜歡助手做同樣的傭工

public class InitUser 
{ 
    public InitUser(SqlDataReader dr, User u) { } 
} 

public class InitUserExtension : InitUser 
{ 
    public InitUserExtension(SqlDataReader dr , UserExtension u) : base(dr, u) { } 
}