gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:28:16 25 4
gpt4 key购买 nike

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

问题出在我名为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com