Loading...
a.polyanska avatar a.polyanska 107 Точки

[Technical Issue] Имплементиране на интерфейс

Здравейте,

Оказва се, че имам голям проблем с разбирането на интерфейсите. Конкретният ми ъпрос е по повод задачата от домашното за наследяване - Company Hierarchy. Създала съм следния интерфейс:

 public interface IEmployee
    {
         decimal salary { get; set; }
         Department department { get; set; }

    }

който се опитвам да имплементирам тук

По този начин направено обаче, ми казва, че не изпълнявам съответния интерфейс. Огледах домашните на миналия курс и не откривам съществена разлика между това, което някои от колегите са правили и това. Сигурно има щом техните вървят, та ще съм благодарна, ако някой ми разясни какво не правя, както трябва- конкретно - по-общо- защо изобщо съществуват пустите му интерфейси? За да те "задължат" да не изпуснеш някакво свойство или метод ли?

0
C# OOP Basics
a.angelov avatar a.angelov 1316 Точки

Уеднакви пропъртитата - пишат се с PascalCase - всяка дума започва с главна буква. В твоя код пропъртитата в интерфейса са с малки букви, а в клас Employee едното пропърти е с малка буква, а другото с голяма.

И да - смисъла на интерфейсите е това - имплементирането на интерфейс задължава класа да имплементира всички членове на интерфейса.

1
01/02/2015 11:35:17
a.polyanska avatar a.polyanska 107 Точки

@a.angelov, Така се получи, но трябваше да изтрия полето "private decimal salary". Да разбирам ли, че  полета, декларирани в съответния интерфейс са все едно декларирани и в класа, който го наследява?

@ goodlifeinc , базовият клас не би трябвало да пречи- щом могат да се наследяват едновременно и клас, и интерфейс... Абе, подозирам, че основната задача на интерфейсите е да ме гърбят, а останалото са странични ефекти, но това е малко извън темата :)

0
a.angelov avatar a.angelov 1316 Точки

Само автоматичното пропърти си прави отзад поле /без да го виждаш/. Ако правиш валидация в пропъртито задължително ти трябва и private поле, в което да запазиш стойността /ако не бъркам нещо/.

0
01/02/2015 11:28:38
a.polyanska avatar a.polyanska 107 Точки

@a.angelov, искам да кажа, че щом имам автоматично пропърти в интерфейса, който ъм задължена да имплементирам, това значи ли, че няма нужда от съответното поле в конкретния клас, който имплементира? Защото, когато оставя в класа да има прайвът селъри поле, ми казва, че селъри е вече дефинирано веднъж и има конфликт. За това говоря:

 

public class Employee: IEmployee

// private decimal salary;

public Employee
            (int employeeID, string employeeFirstName, string employeeLastName, decimal employeeSalary, Department employeeDepartment)
            : base(employeeID, employeeFirstName, employeeLastName)
        {
            this.salary = employeeSalary;
            this.department = employeeDepartment;
        }

 

P.S. CamelCase не е ли всъщност camelCase?

0
goodlifeinc avatar goodlifeinc 31 Точки

Здравей,

и аз не съм ги разбрал все още, но ще опитам да дам отговор:

дали не е от конструктора на Employee : 

  1. public Employee
  2.             (int employeeID, string employeeFirstName, string employeeLastName, decimal employeeSalary, Department employeeDepartment)
  3.             : base(employeeID, employeeFirstName, employeeLastName)

би трябвало да е така ако наследява базов клас, но тъй като наследява интерфейс не съм сигурен, че трябва да е с : base()

0
nickpanaiotov avatar nickpanaiotov 21 Точки

Интерфейсите не се наследяват, те се имплементират. Интерфейсите са договор между класовете, какви методи и пропъртита трябва да има един клас за да може да върши работата за която са го написали. С IEnumerable най лесно се вижда, разгледай го

На човешки език казано. Трябват ти хора които да копаят дупка, и ти си търсиш копачи на дупка, не те интересува бели ли са черни ли са, малки-големи, умни-тъпи. Ти отиваш в агенцията и казваш трябват ми копачи на дупка и те ти листват всички хора които са квалифицирани тоест имплементират този интерфейс. Листват ти всички хора които са имплементирали ICopachiNaDupkable.

3
Antoveravip avatar Antoveravip 67 Точки

Както отбеляза колегата имаш разлика в имената на пропъртитата (C# e case sensetive), затова не ти приема че си имплементирала правилно интерфейса - и пропъртитата трябва да следват CamelCase конвенцията.

Относно интерфейсите - приеми ги като договори. Когато даден клас е имплементирал интерфейс, то значи си сигурна че този клас има съответните пропътита, методи и т.н., което ти помага в даден момент да вдигнеш нивото на абстракция и да не си зависима от определени класове, а само от интерфейсите.

Например можеш вместо да си създаваш List<Employee> да създадеш List<IEmployee>, което ти вдига с едно ниво абстракцията и не те обвързва с конкретният клас и даденият начин на имплементация.

2
a.polyanska avatar a.polyanska 107 Точки

Ох, много се посмях на IKopachNaDupki :))

Уж, разбрах идеята, но изпълнението ми не се получава. Отново поствам интерфейса(примерно този- няма значение, защото ми дава една и съща грешка):

  public interface IPerson
    {
         int id { get; set; }
         string firstName { get; set; }
         string lastName { get; set; }
    }

А ето и класът, който го имплементира: ето

Вижулъл студио, обаче, ми казва, че НЕ е имплементиран. Когато чукна ctrl + . ми дава ето това за изпълнение:

 int IPerson.id
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

и т.н- останалите по същия шаблон.

Кое пак не съм разбрала?

 

П.С.

Егати договорите, егати дупкокопачите! :)

1
01/02/2015 14:06:52
a.angelov avatar a.angelov 1316 Точки

Ами отново си написала пропъртитата в интерфейса с малка буква... - пропъртита винаги се пишат с първа главна буква, и всяка следваща дума също с главна буква - FirstName. Трябва идентификаторите да са едно към едно в интерфейса и имплементиращия клас.

1
a.polyanska avatar a.polyanska 107 Точки

Ох, бе, май разбрах- т.е. полетата могат да имат различни имена, но пропъртитата, трябва да са същите като тези в интерфейса, защото той ги задава. Така ли? Схванах ли най-сетне?

0
a.angelov avatar a.angelov 1316 Точки

Пропъртитата е прието да са със същите имена като полетата с тази разлика, че започват с главна буква.

Имената на членовете на интерфейса, трябва да са напълно еднакви с тези в имплементиращия клас. Както казах по-горе с Ctrl+. и клик на implement interface еди кой си, си решаваш проблема с възможна грешка в това отношение.

0
a.polyanska avatar a.polyanska 107 Точки

Ако някой има време, сили и желание, ще се радвам да погледне какво сътворих. Ще се радвам и на конструктивна критика, още повече- на конструктивни похвали smile Колкото по-детайлни- толкова по-добре!

Не много хора проверяват домашни и не винаги имам добра обратна връзка, та затова, много ще ми помогнете с коментари, че да ми се доизяснят нещата. Благодаря!

Ето задачата

1
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Единствените забележки, които забелязах, са за форматирането на кода, но това не е по темата. :)

Само един съвет ще ти дам: не прекалявай с namespace и папките. Можеш да изведеш всички интерфейси в една папка Interfaces, релативна на тази на проекта - сиреч в root. Базовия клас и енумерацията също в root и всички наследници на Employee в папка "Employees".

Според мен не е необходимо за всеки отделен тип да се прави нов namespace, а за няколко класове, които имат сходни свойства/наследяват един и същи клас.

Имената на namespace трябва да са релативни на директорията.

namespace [Име на проекта].[Папка в проекта].[Папка в папката]

Виждам, че повечето така си ги направила, но други не. - липса на консистентност. Като цяло това е на тема КПК. :)

1
RoYaL avatar RoYaL Trainer 6849 Точки

До сега не съм виждал проект, в който интерфейсите са отделени в папка интерфейси, обикновено са там, където са съответният тип данни. Опитах се да разгледам кода на .NET в Github. Не видях и там да ги отделят в отделна папка :)

1
a.polyanska avatar a.polyanska 107 Точки

Благодаря, заемам се с обратния процес- по връщането :)

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.