Когда Уместно использовать Дженерики По сравнению с Наследованием?

Сделайте что-то вроде этого:

 $('#YourTable tbody').on( 'click', 'a', function () {
              var data = '';
              data = YourTable.row( $(this).parents('tr') ).data();
              //to do this your table need to be declared like this
             //yourTable= $('#YourTable').DataTable();
              console.log(data);
              var carId= data['id'];
              console.log(carId);
})

, если у вас возникли проблемы, проверьте этот пост, где я ответил на что-то похожее Событие JQ не активировано в сортировке строк извлечения по datatable.js [ 113]

8
задан Laz 28 April 2009 в 21:00
поделиться

6 ответов

Они ' это действительно разные идеи. Обобщения позволяют вам объявлять общие «специфические» функциональные возможности (рискуя казаться оксюморонными) в общем виде. List не функционирует иначе, чем List , за исключением типа данных, которые содержатся внутри.

Хотя наследование может использоваться для сделать то же самое, я мог бы создать класс List , затем класс IntList и класс StringList , которые наследуются от него. Я мог бы легко заставить эти два класса функционировать совершенно по-разному, или иметь один функционал предложения, недоступный в другом.

Редактировать

После просмотра редактирования вопроса, ответ сортируется: «Это зависит». Вы можете привести аргументы для обеих сторон - и, действительно, LINQ to SQL и Entity Framework являются комбинацией как рефлексивного осмотра с использованием обобщенных типов, так и строго типизированных классов сущностей и других классов репозитория. Вы, конечно, можете использовать подход, который вы рассматриваете, просто знайте, что, в общем, проблема, которая может быть решена либо с помощью рефлексии, либо с помощью чего-то другого, скорее всего, будет быстрее, когда будет решена «чем-то другим». Все сводится к тому, сколько вы хотите компромисса между производительностью, ремонтопригодностью, удобочитаемостью и надежностью.

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

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

6
ответ дан 5 December 2019 в 04:38
поделиться

Обобщение и наследование - это две разные вещи. Наследование - это концепция ООП, а дженерики - это функция CLR, которая позволяет указывать параметры типа во время компиляции для типов, которые их представляют.

Наследование и дженерики на самом деле довольно хорошо работают вместе.

Наследование:

Наследование позволяет мне чтобы создать один тип:

class Pen { }

, а затем позже создать другой тип, который расширяет Pen :

class FountainPen : Pen { }

Это полезно, потому что я могу повторно использовать все состояние и поведение базового класса и выставлять любое новое поведение или состояние в FountainPen . Наследование позволяет мне быстро создавать более конкретную версию существующего типа.

Дженерики:

Дженерики - это функция CLR, которая позволяет мне создавать такой тип:

class Foo<T> 
{
    public T Bar { get; set; }
}

Теперь, когда я использую Foo

12
ответ дан 5 December 2019 в 04:38
поделиться

You should use generics when you want only the same functionality applied to various types (Add, Remove, Count) and it will be implemented the same way. Inheritance is when you need the same functionality (GetResponse) but want it to be implemented different ways.

10
ответ дан 5 December 2019 в 04:38
поделиться

Use generics to specify an algorithm or type's behaviour which can be expressed in terms of some "unknown type" while keeping an API which is strongly typed in terms of that unknown type. The unknown type is known as a type parameter and is expressed in the code like this:

public class List<T>
{
    public void Add(T item)
}

(etc) - here T is the type parameter. Generic methods are similar:

public void Foo<T>(T item)

The calling code specifies the type argument it wants to work with, e.g.

List<string> list = new List<string>();
list.Add("hi");

Use inheritance to specialize the behaviour of a type.

I can't really think of many places where they're alternatives to each other...

10
ответ дан 5 December 2019 в 04:38
поделиться

Наследование - это гораздо больше о "is-a" (лягушка - животное), где generics - это создание контейнеров, которые действовать на типизированных данных (список T, процессор T и т. д.). Они не являются взаимоисключающими .

Вы можете иметь это, если хотите:

public class Base<T>
{

}

public class Derived : Base<Foo>
{

}
3
ответ дан 5 December 2019 в 04:38
поделиться

Используйте универсальные шаблоны, если вы хотите создать «шаблон», который может применяются ко многим стилям неизвестных классов. Например. Коллекции проведения ??? являются хорошими кандидатами на дженерики. Наследование - это когда у вас есть базовая концепция, согласно которой дети «являются» расширением этой концепции.

Мои общие правила

  • , если вы начнете определять свойства как Object в своем коде и часто приводите типы, то, вероятно, пришло время для дженерики.
  • Если вы хотите программировать против «более высокой концепции», а также производного класса, тогда его наследование.
  • Если ваш класс собирается обернуть или работать с согласованным классом, то его дженериками.
  • Если вы полагаетесь на специфику неизвестного «еще предстоит определить» class, тогда вам, вероятно, лучше с дженериками.
  • Если производные классы являются «is a», то обычно это наследование.
  • Если ваш суперкласс «использует некоторый x», то его обобщения.
5
ответ дан 5 December 2019 в 04:38
поделиться