Нужно ли / почему WebViewPage наследоваться дважды, для generic + non-generi c? - PullRequest
0 голосов
/ 09 января 2020

Я унаследовал кодовую базу и нашел код, который не могу понять, зачем (и , если ) он нужен.

Это пользовательский 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 наследоваться от двойного, для generic + non-generi c?

1 Ответ

0 голосов
/ 10 января 2020

во-первых, он не наследуется дважды, у вас есть две реализации одного и того же класса, одна является generi c, а другая не является generi c.

вы не предоставили нам внутренний код, так что вот пример, скажем, у вас есть что-то вроде этого ..

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);
        }
    }

Так зачем вам дженери c page? если есть некоторые задачи, которые являются общими для всех страниц, вы просто делаете обобщенный c метод для выполнения этой работы. ниже приведен пример использования. скажем, у вас есть ПОЛЬЗОВАТЕЛИ И ЗАКАЗЫ таблиц в вашем курсе dbcontext

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();

, и вы можете Спросите, почему вся эта суета? реализовать обобщенные c методы, но иногда случается, что более сложный сценарий ios оказывается более сложным, чем выборка всех записей и c.

скажем, у вас есть более 20 таблиц, и вы решили заполнить только 5 записей из каждой таблицы. без обычной реализации c вы должны go на 20+ страницах и изменить код

с

var filledData = db.TABLE_TYPE.ToList();

на

var filledData = db.TABLE_TYPE.Take(5).ToList()

с помощью дженериков вы можете просто исправить это в приведенном ниже методе, вы можете даже сделать его параметри c

public List<T> Fill()
    {
        return db.Set<T>().Take(5).ToList();
    }

и вы в безопасности ..

сейчас Если бы вы использовали не generi c реализация MyPageBase

все эти вещи, что вам нужно было делать, вы должны были писать их снова и снова.

Конечно, написание все большего и большего количества кода дает вам опыт, но через некоторое время при работе в программе, особенно в крупном масштабе, вы хотите сделать вещи простыми, понятными и понятными, насколько это возможно ..

I Прошу прощения за мой плохой английский sh,

Надеюсь, я был ясен, и это помогло вам!

...