2008-11-27 5 views
1

Я хочу создать поддерживаемый код, но эта ситуация наследования вызывает у меня проблемы.Унаследованный класс quagmire, как сделать этот код поддержки

Проблема связана с моим вторым вспомогательным классом базы данных с именем 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

Как насчет перемещения обработки имени и т. Д. В метод (прием пользователя или пользователя T: пользователь) и вызов этого из обоих?

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 , то я могу сказать, это то, что объект я хочу, чтобы создавать и присваивать значение (от читателя или строки таблицы) – 2008-11-27 14:52:30

+0

@ Andrew Bullock - как редактирование, которое я только что добавил? – 2008-11-27 14:57:20

1

Почему вы не звоните InitUser из метода InitUserExtension. Пусть базовая инициализация обрабатывает свойства базового класса и позволяет расширенному инициализатору обрабатывать свойства класса расширения.

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 = ....; 

    } 
} 

Пробег может варьироваться в зависимости от обстоятельств

Таким образом, вызов, как

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) { } 
} 
Смежные вопросы