C# WebViewPage是否/为什么需要继承两次(对于泛型+;非通用的?

C# WebViewPage是否/为什么需要继承两次(对于泛型+;非通用的?,c#,generics,viewpage,C#,Generics,Viewpage,我继承了一个代码库,发现了一些我无法理解为什么(以及是否)需要它的代码 这是一个自定义的ViewPage,但我们有完全相同的代码重复两次-一次用于ViewPage,一次用于ViewPage 基本上: public class MyPageBase : WebViewPage { //A whole bunch of properties intended to be accessible on every page } public class MyPageBase<T> :

我继承了一个代码库,发现了一些我无法理解为什么(以及是否)需要它的代码

这是一个自定义的
ViewPage
,但我们有完全相同的代码重复两次-一次用于
ViewPage
,一次用于
ViewPage

基本上:

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 { //在每个页面上都可以访问的一大堆属性 } 公共类MyPageBase:WebViewPage { //完全相同的属性。实际上在任何地方都不使用t。代码完全相同。 } 拥有如此多的重复代码远非理想。更糟糕的是,我不明白为什么需要它。一些测试表明,最上面的一个似乎没有任何作用,但我无法对所有视图进行全面搜索(这个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);
        }
    }
你可以问为什么这么大惊小怪?实现通用方法,但有时会出现比获取所有记录等更复杂的场景

假设您有20多个表,并且您决定只填写每个表中的5条记录。没有通用的实现 你知道你必须翻过20多页,修改你的代码

然而,对于泛型,您可以用下面的方法修复它,甚至可以将其参数化

public List<T> Fill()
    {
        return db.Set<T>().Take(5).ToList();
    }
公共列表填充()
{
返回db.Set().Take(5.ToList();
}
你是安全的

现在,如果要使用MyPageBase的非通用实现

所有这些你需要做的事情你必须一遍又一遍地写

当然,编写越来越多的代码会给你们带来经验,但在一段时间后,当你们在一个程序中工作时,尤其是在一个大规模的程序中工作时,你们希望让事情尽可能简单、易懂和可维护

我很抱歉我的英语不好


我希望我是清楚的,这对你有帮助

对不起,我想我不清楚。我所说的“完全相同的属性”是指代码完全相同。它实际上并不在任何地方使用
t
var filledData = db.USERS.ToList();
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();
    }