我想创建可维护的代码,但这种继承情况导致了我的问题。
问题在于我的第二个数据库助手类名为 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 = ....;
}
答案 0 :(得分:2)
如何将Name等处理移动到方法中(接受用户或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;
}
答案 1 :(得分:1)
为什么不从InitUser
方法拨打InitUserExtension
。让基本初始化处理基类属性,让扩展初始化程序处理扩展类属性。
答案 2 :(得分:1)
如果您更喜欢帮助者,请使用帮助者
public class InitUser
{
public InitUser(SqlDataReader dr, User u) { }
}
public class InitUserExtension : InitUser
{
public InitUserExtension(SqlDataReader dr , UserExtension u) : base(dr, u) { }
}
答案 3 :(得分: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);
将适当地填充所有字段。