Skip to content

Commit 7c05863

Browse files
committed
Lesson 77
1 parent aba7a54 commit 7c05863

File tree

7 files changed

+262
-1
lines changed

7 files changed

+262
-1
lines changed

Lesson77/App.config

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<configuration>
3+
<startup>
4+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
5+
</startup>
6+
</configuration>

Lesson77/Lesson77.csproj

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
4+
<PropertyGroup>
5+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
7+
<ProjectGuid>{02E883E5-61FF-471A-B279-BDF44C395F2A}</ProjectGuid>
8+
<OutputType>Exe</OutputType>
9+
<RootNamespace>Lesson77</RootNamespace>
10+
<AssemblyName>Lesson77</AssemblyName>
11+
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
12+
<FileAlignment>512</FileAlignment>
13+
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
14+
<Deterministic>true</Deterministic>
15+
</PropertyGroup>
16+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
17+
<PlatformTarget>AnyCPU</PlatformTarget>
18+
<DebugSymbols>true</DebugSymbols>
19+
<DebugType>full</DebugType>
20+
<Optimize>false</Optimize>
21+
<OutputPath>bin\Debug\</OutputPath>
22+
<DefineConstants>DEBUG;TRACE</DefineConstants>
23+
<ErrorReport>prompt</ErrorReport>
24+
<WarningLevel>4</WarningLevel>
25+
</PropertyGroup>
26+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
27+
<PlatformTarget>AnyCPU</PlatformTarget>
28+
<DebugType>pdbonly</DebugType>
29+
<Optimize>true</Optimize>
30+
<OutputPath>bin\Release\</OutputPath>
31+
<DefineConstants>TRACE</DefineConstants>
32+
<ErrorReport>prompt</ErrorReport>
33+
<WarningLevel>4</WarningLevel>
34+
</PropertyGroup>
35+
<ItemGroup>
36+
<Reference Include="System" />
37+
<Reference Include="System.Core" />
38+
<Reference Include="System.Xml.Linq" />
39+
<Reference Include="System.Data.DataSetExtensions" />
40+
<Reference Include="Microsoft.CSharp" />
41+
<Reference Include="System.Data" />
42+
<Reference Include="System.Net.Http" />
43+
<Reference Include="System.Xml" />
44+
</ItemGroup>
45+
<ItemGroup>
46+
<Compile Include="Program.cs" />
47+
<Compile Include="Properties\AssemblyInfo.cs" />
48+
</ItemGroup>
49+
<ItemGroup>
50+
<None Include="App.config" />
51+
</ItemGroup>
52+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
53+
</Project>

Lesson77/Program.cs

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace Lesson77
8+
{
9+
interface IHasInfo
10+
{
11+
void ShowInfo();
12+
}
13+
interface IWeapon
14+
{
15+
int Damage { get; }
16+
void Fire();
17+
}
18+
abstract class Weapon : IHasInfo, IWeapon
19+
{
20+
public abstract int Damage { get; }
21+
public abstract void Fire();
22+
public void ShowInfo()
23+
{
24+
Console.WriteLine($"{GetType().Name} Damage: {Damage}");
25+
}
26+
}
27+
class Gun : Weapon
28+
{
29+
public override int Damage { get { return 5; } }
30+
31+
public override void Fire()
32+
{
33+
Console.WriteLine("Пыщ!");
34+
}
35+
}
36+
class LaserGun : Weapon
37+
{
38+
public override int Damage { get { return 8; } }
39+
public override void Fire()
40+
{
41+
Console.WriteLine("Пиу!");
42+
}
43+
}
44+
class Bow : Weapon
45+
{
46+
public override int Damage => 3;
47+
48+
public override void Fire()
49+
{
50+
Console.WriteLine("Чпуньк!");
51+
}
52+
}
53+
class Player
54+
{
55+
public void Fire(IWeapon weapon)
56+
{
57+
weapon.Fire();
58+
}
59+
public void CheckInfo(IHasInfo hasInfo)
60+
{
61+
hasInfo.ShowInfo();
62+
}
63+
}
64+
class Box : IHasInfo
65+
{
66+
public void ShowInfo()
67+
{
68+
Console.WriteLine("Йа коробко!");
69+
}
70+
}
71+
class Program
72+
{
73+
static void Main(string[] args)
74+
{
75+
Player player = new Player();
76+
Weapon[] inventory = { new Gun(), new LaserGun(), new Bow() };
77+
foreach (var item in inventory)
78+
{
79+
player.CheckInfo(item);
80+
player.Fire(item);
81+
Console.WriteLine();
82+
}
83+
player.CheckInfo(new Box());
84+
}
85+
}
86+
}

Lesson77/Properties/AssemblyInfo.cs

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
// Общие сведения об этой сборке предоставляются следующим набором
6+
// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
7+
// связанные с этой сборкой.
8+
[assembly: AssemblyTitle("Lesson77")]
9+
[assembly: AssemblyDescription("")]
10+
[assembly: AssemblyConfiguration("")]
11+
[assembly: AssemblyCompany("")]
12+
[assembly: AssemblyProduct("Lesson77")]
13+
[assembly: AssemblyCopyright("Copyright © 2022")]
14+
[assembly: AssemblyTrademark("")]
15+
[assembly: AssemblyCulture("")]
16+
17+
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
18+
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
19+
// из модели COM задайте для атрибута ComVisible этого типа значение true.
20+
[assembly: ComVisible(false)]
21+
22+
// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
23+
[assembly: Guid("02e883e5-61ff-471a-b279-bdf44c395f2a")]
24+
25+
// Сведения о версии сборки состоят из указанных ниже четырех значений:
26+
//
27+
// Основной номер версии
28+
// Дополнительный номер версии
29+
// Номер сборки
30+
// Номер редакции
31+
//
32+
// Можно задать все значения или принять номера сборки и редакции по умолчанию
33+
// используя "*", как показано ниже:
34+
// [assembly: AssemblyVersion("1.0.*")]
35+
[assembly: AssemblyVersion("1.0.0.0")]
36+
[assembly: AssemblyFileVersion("1.0.0.0")]

Lessons.sln

+6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebcamProducer", "WebcamPro
3535
EndProject
3636
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson71", "Lesson71\Lesson71.csproj", "{91058A2C-3CDD-4B7D-8FE9-E1E79E3B00F2}"
3737
EndProject
38+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson77", "Lesson77\Lesson77.csproj", "{02E883E5-61FF-471A-B279-BDF44C395F2A}"
39+
EndProject
3840
Global
3941
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4042
Debug|Any CPU = Debug|Any CPU
@@ -105,6 +107,10 @@ Global
105107
{91058A2C-3CDD-4B7D-8FE9-E1E79E3B00F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
106108
{91058A2C-3CDD-4B7D-8FE9-E1E79E3B00F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
107109
{91058A2C-3CDD-4B7D-8FE9-E1E79E3B00F2}.Release|Any CPU.Build.0 = Release|Any CPU
110+
{02E883E5-61FF-471A-B279-BDF44C395F2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
111+
{02E883E5-61FF-471A-B279-BDF44C395F2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
112+
{02E883E5-61FF-471A-B279-BDF44C395F2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
113+
{02E883E5-61FF-471A-B279-BDF44C395F2A}.Release|Any CPU.Build.0 = Release|Any CPU
108114
EndGlobalSection
109115
GlobalSection(SolutionProperties) = preSolution
110116
HideSolutionNode = FALSE

Lessons/Lessons.cs

+73
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,54 @@ public void CheckInfo(Weapon76 weapon)
794794
weapon.ShowInfo();
795795
}
796796
}
797+
/**
798+
* interface IDataProvider для Task77()
799+
*/
800+
interface IDataProvider
801+
{
802+
string GetData();
803+
}
804+
/**
805+
* interface IDataProcessor для Task77()
806+
*/
807+
interface IDataProcessor
808+
{
809+
void ProcessData(IDataProvider dataProvider);
810+
}
811+
/**
812+
* class ConsoleDataProcessor реализует интерфейс IDataProcessor
813+
*/
814+
class ConsoleDataProcessor : IDataProcessor
815+
{
816+
public void ProcessData(IDataProvider dataProvider)
817+
{
818+
Console.WriteLine(dataProvider.GetData());
819+
}
820+
}
821+
/**
822+
* классы DbDataProvider, FileDataProvider и APIDataProvider реализуют интерфейс IDataProvider
823+
*/
824+
class DbDataProvider : IDataProvider
825+
{
826+
public string GetData()
827+
{
828+
return "Данные из БД";
829+
}
830+
}
831+
class FileDataProvider : IDataProvider
832+
{
833+
public string GetData()
834+
{
835+
return "Данные из файла";
836+
}
837+
}
838+
class APIDataProvider : IDataProvider
839+
{
840+
public string GetData()
841+
{
842+
return "Данные из API";
843+
}
844+
}
797845
/// <summary>
798846
/// C# УРОКИ | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ
799847
/// By #SimpleCode (https://www.youtube.com/c/SimpleCodeIT/featured)
@@ -3096,9 +3144,34 @@ public static void Task76()
30963144
}
30973145
}
30983146
/**
3147+
* интерфейсы и полиморфизм
30993148
*
3149+
* Интерфейс это кострукция языка программрования C#
3150+
* Интерфейсы должны оперделять поведение и контракт, но не должны содержать реализацию
3151+
* Классы реализуют интерфейс
3152+
* У интерфейса есть множественное наследование - это важное отличие интерфеса от класса или абстрактного класса
3153+
* Интерфейсы могут наследоваться между собой (один интерфейс может унаследовать несколько разный интерфесов),
3154+
* один определенный класс может унаследовать несколько интерфесов
3155+
* В интерфесе не может быть конструкторов, интерфейс не может содержать поля класса (переменные)
3156+
* Мы не можем создать экземпляр интерфейса
3157+
* Каждая отдельная сущность должна находится в отдельном файле (для классов и интерфейсов разные файлы)
3158+
* У интефесов нет реализации а только "абстрактные" методы (как у астракнтого класса)
3159+
* Интерфейсы иогут содержать свойства. (Свойства это мотоды которые маскируются под поля)
3160+
* Задачей интерфеса является определить контракт азвимодействий между классами
3161+
* С помощью интерфейса мы определяем поведение которое в последствии будет реализовано в каком-то конкретно классе
3162+
* У интерфесов все поля (методы, свойства) по умолчанию имеют модификатор доступа public
31003163
*/
31013164
public static void Task77()
3165+
{
3166+
IDataProcessor dataProcessor = new ConsoleDataProcessor();
3167+
dataProcessor.ProcessData(new DbDataProvider());
3168+
dataProcessor.ProcessData(new FileDataProvider());
3169+
dataProcessor.ProcessData(new APIDataProvider());
3170+
}
3171+
/**
3172+
*
3173+
*/
3174+
public static void Task78()
31023175
{
31033176

31043177
}

Lessons/Program.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ static void Main(string[] args)
128128
//Lessons.Task73();
129129
//Lessons.Task74();
130130
//Lessons.Task75();
131-
Lessons.Task76();
131+
//Lessons.Task76();
132+
Lessons.Task77();
132133

133134

134135
//Sololearn.Task15();

0 commit comments

Comments
 (0)