我正在研究一种通用方法,该方法(目前(可以做同样的事情,但最终可能需要将来扩展。
假设此方法GetProducts()
在主页和产品页面中调用
。所以我的代码是这样的:
class HomePage
{
public List<BaseInfo> LoadHomePage()
{
List<BaseInfo> baseInfo = new List<BaseInfo>();
baseInfo.Add(GetProducts(5));
return baseInfo;
}
public Products GetProducts(int count)
{
return apiProducts().Take(count).ToList();
}
}
然后,在另一个类文件中:
class ProductsPage
{
public List<BaseInfo> LoadProductPage()
{
List<BaseInfo> baseInfo = new List<BaseInfo>();
baseInfo.Add(GetProducts(100));
return baseInfo;
}
public Products GetProducts(int count)
{
return apiProducts().Take(count).ToList();
}
}
现在,我想将此GetProducts()
移动到一个通用类文件中,并在HomePage
和ProductsPage
上继承该文件。
class CommonMethods
{
public Products GetProducts(int count)
{
return apiProducts().Take(count).ToList();
}
}
遗产:
class HomePage : CommonMethods
class ProductsPage: CommonMethods
但是,当我需要在产品页面上出于特定目的修改GetProducts
并且不想影响HomePage
时,最好的方法是什么?我想避免破坏其他页面,因为我正在更改一种常用方法。
我尝试了使GetProducts()
虚拟并在ProductsPage
上覆盖该方法的想法。那会起作用,但我仍在考虑这里是否有更好的方法。我可以考虑任何设计模式吗?
编辑:
我试图避免的主要问题是使用一种通用方法,当我对此GetProducts()
进行更改时,我不想破坏主页和产品页面上的功能;
例如,在主页上,我只需要 2 个数据(ID 和名称(
然后在产品页面上,我想扩展返回的数据,比如价格、数量等。 下面的示例方法,但我正在寻找更好的解决方案:
public Products GetProducts(int count, string page)
{
if(page == "Home")
return apiProducts().Select(x => new Products { Id = x.id, Name = x.name, Name = x.name }).Take(count).ToList();
elseif (page == "Products")
return apiProducts().Select(x => new Products { Id = x.id, Name = x.name, Name = x.name, Price = x.price, Qty = x.qty }).Take(count).ToList();
}
谢谢大家。
继承并不总是答案。有时像下面这样的简单助手就可以做到
internal static class ProductsHelper // -- STATIC
{
// generic method that will work for all products
public static List<T> GetProducts<T>(IEnumerable<T> products, int count)
{
return products.Take(count).ToList();
}
}
我认为你只需要使用分解并将你的GetProducts
方法移动到另一个类。例如ProductsRepository
然后,您只需要使用构造函数注入将ProductsRepository
注入到HomePage
和ProductsPage
类。喜欢这个:
class ProductsPage
{
private ProductsRepository _rep;
public ProductsPage(ProductsRepository rep)
{
_rep=rep;
}
public List<BaseInfo> LoadProductPage()
{
List<BaseInfo> baseInfo = new List<BaseInfo>();
baseInfo.Add(_rep.GetProducts(100));
return baseInfo;
}
}