Използване на метод чрез интерфейс ООП Student Worker


0

Здравейте,

На една от лекциите по ООП беше казано, че е добре да свикнем да пишем всичко пуплично (методи и пропъртита), като интерфейси.

На първото домашно се опитах да направя един интерфейс към класа Worker и метода MoneyPerHour().

Интерфейса е зададен, както следва:

namespace Students_Workers { public interface IWorker { double MoneyPerHour(); } }

В класа Worker има имплементация на този метод:

using System; namespace Students_Workers { public class Worker : Human, IWorker { private double weekSalary; private double workHoursPerDay; public Worker(string firstName, string lastName, double weekSalary, double workHoursPerDay) : base(firstName, lastName) { this.WeekSalary = weekSalary; this.WorkHoursPerDay = workHoursPerDay; } private double WeekSalary { get { return this.weekSalary; } set { this.weekSalary = value; } } private double WorkHoursPerDay { get { return this.workHoursPerDay; } set { this.workHoursPerDay = value; } } public double MoneyPerHour() { return WeekSalary/WorkHoursPerDay; } public override string ToString() { return String.Format("{0} {1} {2} {3}", FirstName, LastName, WeekSalary, WorkHoursPerDay); } } }

Въпроса ми е как точно използваме интерфейса в мейн метода. Ако напишем нещо от сорта на:

Worker worker = new Worker("Stoil", "Kralev", 350, 8); worker.MoneyPerHour();

Ще бъде ли използван интерфейса или за да го използваме трябва да напишем нещо от сорта на :

IWorker workerinter = (IWorker)worker; workerinter.MoneyPerHour();
Мерси предварително.

в C# OOP от perro (7 точки)


Отговори



0

В интерфейса описваш само метода - като име и какво връща, както си го направил. Имплементацията на метода е в самия кас Worker. И си го извикваш както всеки метод:

double money = worker.MoneyPerHour();

като worker е инстанция на класа.


от Slavka74 (436 точки)


0

Значи няма нужда да се правят неща от сорта на : IWorker workerinter = (IWorker)worker; workerinter.MoneyPerHour(); ?

Ако напишем worker.MoneyPerHour(), където worker е инстанция на Worker и сме имплементирани интерфейс, който извиква метода MoneyPerHour() извикването преминава през интерфейса?

Не ми е много ясно как точно се разграничават различните извиквания на метода - директно чрез инстанцията на класа и чрез интерфейса?


от perro (7 точки)

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

от Slavka74 (436 точки)


3

Здравей колега,

Със сигурност не мога да се съглася със Славка, че основната роля на interface-a е систематизиране на код.

Interface-a служи за дефиниране на общи състояния за всички които го имплементират. Един пример тук Цък.

Идеята е проста: Имаш една абстракция Работник, който може да прави нещо (DoSomething) и имаш 2 class-a (шаблона на различни работници които трябва да могат да правят това нещо, но не е задължително да е по един и същ начин(тялото на метода DoSomething е различно за 2-та класа), но резултата винаги е един и същ).

Трябва да дефинираме колекция от работници или метод който ползва работник, без значение дали ще ползваме работник от шаблон1(class1) или шаблон2(class2), ние знаем че те могат да правят това действие(DoSomething) резултата му е един и същ и на нас ще ни свърши работа който и да е работник.

Когато си създаваме конкретния обект ние си ползваме класовете за да им дадем цялата функционалност на нашия клас, но за самите методи ползваме interface-a. Ако в метода си сложиш името на твоя клас, и аз създам мой който имплементира същия interface и прави същото действие, аз няма да мога да ползвам общия метод(MyMethod) защото ще си го направил да работи с конкретен тип, а не с абстракцията Работник.


от ktsvetanov (705 точки)