c# - 继承类的泥潭,如何让这段可维护的代码

标签 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 = ....;
}

最佳答案

如何将 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/

相关文章:

c# - 在 ASP.NET MVC 中使用状态机工作流

c# - Glimpse 不工作

python - 使用装饰器向 __all__ 添加名称是一种好习惯吗?

c++ - eclipse 中是否有任何插件或附加组件可用于根据一组编码标准检查/(如果有的话设置自己的规则)C/C++ 源代码?

c# - 是否有可能知道哪个 .NET 代码创建了一个临时文件?

c# - 在asp.net C#中的后面代码中获取sql错误代码

c# - 任何应用程序内的插入位置/位置

coding-style - C/PHP/Java 等中不同的支撑/缩进样式的名称是什么?

data-structures - 为什么代码作为数据?

php - 试图避免 "spaghetti code",为什么多个 if-else 不好?