Здравствуйте. Какая разница между созданием экземпляра класса от интерфейса ? Например (пример взят с msdn), необходимо получить объект Lookup.
class Package
{
public string Company { get; set; }
public double Weight { get; set; }
public long TrackingNumber { get; set; }
}
public static void LookupExample()
{
List<Package> packages = new List<Package>
{
new Package { Company = "Coho Vineyard", Weight = 25.2, TrackingNumber = 89453312L }
};
Lookup<char, string> lookup = (Lookup<char, string>)packages
.ToLookup(p => Convert.ToChar(p.Company.Substring(0, 1)),
p => p.Company + p.TrackingNumber); }
Здесь экземпляр packages класса Package явно преобразуется в класс Lookup<>. А в следующем примере:
public static void LookupExample()
{
List<Package> packages = new List<Package>
{
new Package { Company = "Coho Vineyard", Weight = 25.2, TrackingNumber = 89453312L }
};
ILookup<char, string> lookup = packages
.ToLookup(p => Convert.ToChar(p.Company.Substring(0, 1)),
p => p.Company + p.TrackingNumber); }
Используется интерфейс ILookup и преобразование происходит неявно. И еще раз к вопросу: Какая разница между созданием экземпляра класса от интерфейса ? И почему во втором случае не нужно явное приведение?
Если взглянуть на определение метода ToLookup
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector
)
Видно, что типом возвращаемого значения является ILookup то есть интерйейс. Соответственно, в случае
ILookup<char, string> lookup = packages
.ToLookup(p => Convert.ToChar(p.Company.Substring(0, 1)),
p => p.Company + p.TrackingNumber);
явного преобразования одинаковых типов не требуется . Однако, когда происходит присвоение интерфейса к реализующему его классу
Lookup<char, string> =ILookup<char, string>
преобразование осуществляется явно. Нужно заметить, что при присвоении класса к интерфейсу, который он реализует
ILookup<char, string> =Lookup<char, string>
явное преобразование тоже не нужно.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени суток
Как можно реализовать алгоритм задачи комивояжера, используя очередь? Нужно найти исчерпывающим поиском в ширинуЯ понимаю как сделать это...
Есть WinForms программа он получат данные из БД-ки на DataGridView только при нажатии кнопки, это работает