
1
00:00.230 --> 00:00.830
بسیار خب.

2
00:00.830 --> 00:05.750
پس ما سه مورد از پنج کاربرد اینترفیس‌ها (Interfaces) رو دیدیم.

3
00:05.750 --> 00:13.310
اول برای ترویج قابلیت استفاده مجدد (reusability) و انعطاف‌پذیری (flexibility) کد، بعد جدا کردن کد (decoupling code) و افزایش قابلیت تست (testability).

4
00:13.310 --> 00:20.030
و توی چند ویدیوی اخیر، دیپندِنسی اینجِکشِن (dependency injection) رو بررسی کردیم، که باید بگم موضوع نسبتاً مفصلی بود.

5
00:20.030 --> 00:24.590
اما مورد شماره چهار رو قراره بعداً با یانیک پوشش بدیم.

6
00:24.590 --> 00:28.100
و مورد شماره پنج چیزیه که می‌خوام تو این ویدیو دربارش صحبت کنم.

7
00:28.100 --> 00:30.890
یعنی دستیابی به وراثت چندگانه (Multiple Inheritance).

8
00:30.890 --> 00:38.270
خب، کجا باید از وراثت چندگانه استفاده کنیم؟ وقتی که نیاز داریم یک کلاس چندین قابلیت (functionalities) رو پیاده‌سازی کنه،

9
00:38.300 --> 00:38.690
اوکی؟

10
00:38.690 --> 00:39.770
و چرا باید این کار رو بکنیم؟

11
00:39.770 --> 00:44.210
خب، برای اینکه به یک کلاس اجازه بدیم با چندین قرداد (contracts) انطباق پیدا کنه و کِی؟

12
00:44.210 --> 00:48.920
خب، تو مثال ما، تو یک دستگاه چندمنظوره کامل که هم می‌تونه پرینت بگیره و هم اسکن کنه.

13
00:48.920 --> 00:53.420
پس قراره یک نرم‌افزار کوچیک بسازیم که به ما اجازه بده پرینت و اسکن انجام بدیم.

14
00:53.420 --> 01:00.770
این بهمون نشون می‌ده که چطور مفهوم وراثت چندگانه (multi inheritance) یا (multiple inheritance) می‌تونه در سی شارپ (C#)

15
01:00.770 --> 01:03.740
با یک راه‌حل موقتی (workaround) از طریق اینترفیس‌ها، محقق بشه.

16
01:03.740 --> 01:04.010
درسته؟

17
01:04.010 --> 01:10.490
خب، ما دیدیم که نمی‌تونیم هم‌زمان از دو کلاس ارث‌بری کنیم، اما می‌تونیم هم‌زمان از چندین اینترفیس ارث‌بری کنیم.

18
01:10.490 --> 01:11.060
خب.

19
01:11.060 --> 01:13.730
پس بیاید ببینیم این چطور کار می‌کنه.

20
01:13.730 --> 01:15.200
خب، بیاید بسازیمش.

21
01:15.200 --> 01:20.780
بنابراین من یک public interface به اسم IPrintable خواهم داشت.

22
01:20.780 --> 01:23.600
و بعد اون فقط پرینت می‌گیره، اوکی؟

23
01:23.600 --> 01:24.740
کار دیگه‌ای انجام نمی‌ده.

24
01:24.740 --> 01:35.090
و بعد یک public interface دیگه دارم که IScannable خواهد بود و اون اسکن می‌کنه: void scan، اوکی؟

25
01:35.090 --> 01:41.420
و بعد یک کلاس دیگه دارم که یک پرینتر چندمنظوره (multi-function printer) خواهد بود، اوکی؟

26
01:41.420 --> 01:50.030
پس public class MultiFunctionPrinter که اینترفیس IPrintable و اینترفیس IScannable رو پیاده‌سازی می‌کنه.

27
01:50.030 --> 01:50.900
خب.

28
01:50.900 --> 01:55.340
و این فقط یک مثال هست، چون پتانسیل پیاده‌سازی کلی اینترفیس بیشتر رو هم داره.

29
01:55.340 --> 01:58.490
پس من فقط برای ساده‌سازی از دو تا استفاده می‌کنم.

30
01:58.490 --> 02:05.270
و اینجا تو این کلاس، تو MultiFunctionPrinter، جاییه که من می‌خوام بگم چطور واقعاً پرینت می‌گیرم

31
02:05.270 --> 02:06.530
و چطور واقعاً اسکن می‌کنم.

32
02:06.530 --> 02:10.730
چون حالا این پرینتر داره ارث‌بری می‌کنه، به اصطلاح.

33
02:10.730 --> 02:14.090
نه واقعاً، اما داره چندین اینترفیس رو پیاده‌سازی می‌کنه.

34
02:14.090 --> 02:17.120
پس داره تا حدی وراثت چندگانه انجام می‌ده.

35
02:17.120 --> 02:24.650
پس اینجا حالا می‌تونم بگم که پیاده‌سازی متد پرینت من چطور باید باشه و پیاده‌سازی

36
02:24.650 --> 02:27.440
متد اسکن من چطور باید باشه.

37
02:27.440 --> 02:28.190
اوکی.

38
02:28.190 --> 02:33.950
و حالا مثلاً اینجا فقط می‌گیم: "در حال اسکن سند".

39
02:33.950 --> 02:39.350
و تو دستور پرینت، فقط می‌گیم: "در حال چاپ سند".

40
02:39.350 --> 02:40.130
بسیار خب.

41
02:40.130 --> 02:44.270
پس حالا بریم جلو و از این تو برنامه‌مون استفاده کنیم.

42
02:44.270 --> 02:51.590
و بنابراین من یک آبجکت از MultiFunctionPrinter خودم ایجاد می‌کنم که اسمش رو می‌ذارم printer.

43
02:51.590 --> 02:55.310
و از این printer برای پرینت گرفتن استفاده می‌کنم.

44
02:55.310 --> 02:58.400
و بعد از این printer برای اسکن کردن استفاده می‌کنم.

45
02:58.400 --> 02:59.450
بفرمایید.

46
02:59.450 --> 03:05.480
خب حالا این رو اجرا می‌کنیم و می‌بینیم که می‌گه: "در حال چاپ سند"، "در حال اسکن سند".
47
03:05.480 --> 03:11.630
پس این یک مثال ساده بود از اینکه چطور می‌شه به وراثت چندگانه دست پیدا کرد.

48
03:11.630 --> 03:20.000
چون این کلاس MultiFunctionPrinter حالا IPrintable و IScannable رو پیاده‌سازی می‌کنه.

49
03:20.000 --> 03:25.970
پس هر دوی این اینترفیس‌ها. خب تو مثال ما این اینترفیس‌ها فقط یک متد ساده دارند.

50
03:25.970 --> 03:29.540
اما می‌تونستند یک عالمه پراپرتی (property) و متدهای زیاد هم داشته باشند.

51
03:29.540 --> 03:32.150
همین موضوع برای اینترفیس IScannable هم صدق می‌کنه.

52
03:32.150 --> 03:35.450
فقط یک متد داره، اما می‌تونست خیلی بیشتر داشته باشه.

53
03:35.450 --> 03:41.870
خب حالا شما ممکنه بگید، مشخصه، می‌تونستید یک کلاس Printer هم بسازید که تمام کارهایی که پرینتر انجام می‌ده رو انجام بده،

54
03:41.870 --> 03:47.750
اما از نظر معماری (architecture) کار رو خیلی سخت‌تر می‌کرد، چون فرض کنید

55
03:47.750 --> 03:54.140
بعداً می‌خواید یک پرینتر داشته باشید که فقط بتونه پرینت بگیره و اسکن نکنه، در اون صورت،

56
03:54.140 --> 03:59.240
تمام این بار اضافی (overhead) رو خواهید داشت، و اینجا هست که این اینترفیس‌ها به درد می‌خورند.

57
03:59.240 --> 03:59.870
اوکی؟

58
03:59.960 --> 04:06.980
خب، چیز باحال تو این مورد اینه که ما حالا انعطاف‌پذیری داریم، چون این MultiFunctionPrinter

59
04:06.980 --> 04:15.380
حالا می‌تونه هر زمانی که به یک آبجکت IPrintable نیاز داریم، یا هر زمانی که به یک آبجکت IScannable

60
04:15.380 --> 04:22.040
نیاز داریم، استفاده بشه، چون اون، به اصطلاح، از هر دو ارث‌بری می‌کنه.

61
04:22.040 --> 04:30.440
پس اون داره هر دو رو پیاده‌سازی می‌کنه، و بنابراین می‌تونیم ازش طوری استفاده کنیم که انگار یک آبجکت IPrintable هست که

62
04:30.440 --> 04:32.450
مثل یک آبجکت IPrintable رفتار می‌کنه.

63
04:32.450 --> 04:36.980
و بعضی وقت‌ها می‌تونه مثل یک آبجکت IScannable رفتار کنه، بسته به اینکه کجا بهش نیاز دارید و چطور

64
04:36.980 --> 04:37.730
می‌خواید ازش استفاده کنید.

65
04:37.730 --> 04:38.090
درسته؟

66
04:38.090 --> 04:42.080
پس اینجا هست که دوباره چندریختی (polymorphism) وارد عمل می‌شه و امثال اون.

67
04:42.080 --> 04:49.610
اما به طور کلی، این روشی هست که می‌تونید وراثت چندگانه رو در سی شارپ پیاده‌سازی کنید.