[英]Does/why does WebViewPage need to be inherited from twice, for generic+non-generic?
我继承了一个代码库,发现了一些我无法弄清楚为什么(以及是否需要)它的代码。
这是一个自定义ViewPage
,但我们将完全相同的代码重复了两次 - 一次用于ViewPage
一次用于ViewPage<T>
。
基本上:
public class MyPageBase : WebViewPage
{
//A whole bunch of properties intended to be accessible on every page
}
public class MyPageBase<T> : WebViewPage<T>
{
//The exact same properties. Doesn't actually use T anywhere. The code is literally identical.
}
拥有如此多的重复代码远非理想。 更糟糕的是,我不明白为什么需要它。 一些测试表明,最上面的一个似乎并没有做任何事情,但我不能做一个全面的搜索的所有视图(这MyPageBase使用几十个应用程序)。
所以我的问题是:对于泛型+非泛型,是否/为什么 WebViewPage 需要从两次继承?
首先,它没有被继承两次,你有同一个类的两个实现,一个是通用的,另一个是非通用的。
你还没有向我们提供内部代码,所以这里有一个例子,假设你有这样的东西..
public class MyPageBase<T> : WebViewPage<T>
{
//The exact same properties
private DbContext db;
public MyPageBase()
{
db = new MPContext();
}
public List<T> Fill()
{
return db.Set<T>().ToList();
}
public T FillBy(object id)
{
return db.Set<T>().Find(id);
}
}
那么为什么需要一个通用页面呢? 如果有一些任务在所有页面中都是通用的,您只需使用通用方法来完成这项工作。 下面是一个非常示例的用法。 假设您的 dbcontext 中有USERS AND ORDERS表
public class UsersPage<USERS>:MyPageBase<USERS>{
public void Index()
{
var filledData = Fill<USERS>();
}
}
public class UsersPage<ORDERS >:MyPageBase<ORDERS >{
public void Index()
{
var filledData = Fill<ORDERS>();
}
}
当然你可以很容易地做到这一点
var filledData = db.USERS.ToList();
你可以问为什么所有的大惊小怪? 实现通用方法,但有时会发生比获取所有记录等更复杂的场景。
假设您有 20 多个表,并且您决定只填充每个表中的 5 条记录。 如果没有通用的实现,你知道必须遍历 20 多页并更改代码
从
var filledData = db.TABLE_TYPE.ToList();
到
var filledData = db.TABLE_TYPE.Take(5).ToList()
但是使用泛型你可以在下面的方法中修复它,你甚至可以让它参数化
public List<T> Fill()
{
return db.Set<T>().Take(5).ToList();
}
你很安全..
现在如果您要使用 MyPageBase 的非通用实现
所有这些你需要做的事情,你必须一遍又一遍地写。
当然,编写越来越多的代码会给你带来经验,但一段时间后,当你在一个程序中工作时,尤其是在大规模的程序中,你希望尽可能保持简单、易懂和可维护。
我很抱歉我的英语不好,
我希望我很清楚,这对你有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.