классы и интерфейсы в c#

325
03 октября 2017, 03:12

Здравствуйте. Какая разница между созданием экземпляра класса от интерфейса ? Например (пример взят с 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 и преобразование происходит неявно. И еще раз к вопросу: Какая разница между созданием экземпляра класса от интерфейса ? И почему во втором случае не нужно явное приведение?

Answer 1

Если взглянуть на определение метода 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> 

явное преобразование тоже не нужно.

READ ALSO
Задача комивояжера

Задача комивояжера

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

271
Как замутить Checkbox с DataGridView? [требует правки]

Как замутить Checkbox с DataGridView? [требует правки]

Есть WinForms программа он получат данные из БД-ки на DataGridView только при нажатии кнопки, это работает

229
C# - Не отправляется объект на сервер

C# - Не отправляется объект на сервер

За основу был взят код метанитаУ меня есть класс:

315