继承类quagmire,如何使这个可维护的代码

时间:2008-11-27 14:35:17

标签: c# coding-style

我想创建可维护的代码,但这种继承情况导致了我的问题。

问题在于我的第二个数据库助手类名为 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 = ....;
}

4 个答案:

答案 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); 

将适当地填充所有字段。