我想创建可维护的代码,但这种继承情况给我带来了问题。
问题出在我名为 InitUserExtension 的第二个数据库助手类上。
由于 UserExtension 继承自 User,我必须确保将 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 = ....;
}
最佳答案
如何将 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;
}
关于c# - 继承类的泥潭,如何让这段可维护的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/323922/