Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 3

Правило для реализации методов интерфейса

28.11.2015, 18:29. Показов 2023. Ответов 8

Студворк — интернет-сервис помощи студентам
У меня есть интерфейс IEntity. Его реализовуют все сущности с которыми я в будущем буду оперировать:

C#
1
2
3
4
5
6
public class UserEntity: IEntity
    {
        public int UserId { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
    }
Также у меня есть интерфейс IModel. Я хочу в этом интерфейсе задать правило что бы все методы, которые будут реализовываться, обязательно принимали на вход только обьекты классов, которые реализуют интерфейс IEntity.

Что-то приблизительно такое:

C#
1
2
3
4
5
6
public interface IModel
    {      
        bool InsertModel(IEntity entity);
        bool DeleteModel(IEntity entity);
        bool UpdateModel(IEntity entity);
    }
Но в итоге получаю ошибку что интерфейс не реализован:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UserModel : IModel{
 
   // .......some code
 
 public bool InsertModel(UserEntityentity)
        {
     // some operations
      }
 
public bool DeleteModel(UserEntity entity)
         {
     // some operations
      }
 
 public bool UpdateModel(UserEntity entity)  {
     // some operations
      }
}
Помогите как исправить?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2015, 18:29
Ответы с готовыми решениями:

Проблема реализации методов интерфейса
Совсем недавно добралась до этой темы, так что пытаюсь освоить. Есть два класса : book и studentbook, где studentbook - дочерний класс от...

Наследование интерфейса без реализации дочерних методов
Имеется интерфейс вида: public interface IRepository<T> where T: class { T GetById(int id); ...

Создать класс для реализации методов решения квадратного уравнения (Нужен максимально короткий код)
Нужен максимально короткий код линк использовать можно НА ВСЕ НЕ БОЛЕЕ 25 МИНУТ!!! 1.Пусть требуется создать класс для...

8
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
28.11.2015, 18:39
Цитата Сообщение от jetonz Посмотреть сообщение
Помогите как исправить?
Реализация интерфейса, если говорить только о методах, означает, что класс, реализующий этот интерфейс, будет иметь методы с точно такой же сигнатурой, как и у методов, определенных в этом интерфейсе.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UserModel : IModel{
 
   // .......some code
 
 public bool InsertModel(IEntity entity)
        {
     // some operations
      }
 
public bool DeleteModel(IEntity entity)
         {
     // some operations
      }
 
 public bool UpdateModel(IEntity entity)  {
     // some operations
      }
}
Добавлено через 2 минуты
Сигнатура в С# - это имя метода, типы параметров метода, а также порядок их следования.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
28.11.2015, 18:40
Цитата Сообщение от jetonz Посмотреть сообщение
Помогите как исправить?
Вот так все компилируется...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
            IModel model = new UserModel();
            IEntity entity = new UserEntity();
            model.InsertModel(entity);
            model.UpdateModel(entity);
            model.DeleteModel(entity);
        }
    }
    class UserModel : IModel {
        public bool InsertModel(IEntity arg) {
            //Some code here...
            return true;
        }
 
        public bool DeleteModel(IEntity arg) {
            //Some code here...
            return true;
        }
 
        public bool UpdateModel(IEntity arg) {
            //Some code here...
            return true;
        }
    }
    class UserEntity : IEntity {
        public int UserId { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
 
        public void Method() {
            //Some code here...
        }
    }
    interface IModel {
        bool InsertModel(IEntity arg);
        bool DeleteModel(IEntity arg);
        bool UpdateModel(IEntity arg);
    }
    interface IEntity {
        void Method();
    }
}
jetonz, на будущее, чтобы точно знать что интерфейс реализован, пользуйтесь средствами Студии. Правой кнопкой на определении интерфейса при описании класса-Реализовать интерфейс (Явно реализовать интерфейс). Студия сгенерирует методы-прототипы, только заполните их кодом.
0
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 3
28.11.2015, 18:49  [ТС]
Проблема вышеописаных реализаций в том, что я не могу получить доступ к полям классов, которые реализовали интерфейс IEntity. Например:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class UserModel : IModel
    {
 
 public bool InsertModel(UserEntity entity)
        {
            entity.Password = MakePassword(entity.Password);
 
            string Query = String.Format("INSERT INTO Drivers(Login, Password) VALUES( '{0}', '{1}')",
                                           entity.Login,
                                           entity.Password);
 
            return Connector.Execute(Query);
        }
В этом примере я имею доступ к полям UserEntity и могу ими оперировать. В случае же с
C#
1
public bool InsertModel(IEntity entity)
среда разработки на это дело естественно ругается.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
28.11.2015, 18:52
Цитата Сообщение от jetonz Посмотреть сообщение
я не могу получить доступ к полям классов
Естественно, и не сможете, если только явно не приведете к нужному типу. Тогда выносите все что надо в интерфейс, зачем-то же он вам понадобился.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
28.11.2015, 18:56
Вы, кстати, не привели определение вашего интерфейса IEntity.
0
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 3
28.11.2015, 19:09  [ТС]
Ладно, начну по порядку. Я решил изучить как разрабатывать 3-tier приложения. Для этого я разделил солюшн на три части: формы , бизнес логика и data access layer. И вот при разработке DAL столкнулся с тем что нужно где-то хранить классы, которые по сути будут проекциями таблиц БД. Одна из таких проекций - UserEntity. Так же я понял что нужно отдельно иметь классы которые будут эти самые "entity" записывать в БД. Для этого я для каждого entity я создал "model". А так как учусь "хорошему тону программирования" решил всё классы типа "model" обобщить интерфейсом IModel в котором указал обязательные методы для любого класса типа "model". А потом решил что было бы правильно ограничить работу классов "model" к операциям только с обьектами типа "entity". Потому и был создан интерфейс "IEntity' а все проекции таблиц БД реализуют этот интерфейс.
Вот так всё сложно)))
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
28.11.2015, 19:42
Раз уж на то пошло, то наиболее общее понятие интерфейса это
Интерфейс - формально определенная физическая и логическая граница между двумя независимыми взаимодействующими объектами
(С) Олифер и Олифер (уч. Компьютерные сети: принципы, технологии, протоколы). То есть, если своими словами, это то, через что общаются два объекта. Применительно к языку это означает, что вы должны пользоваться именно методами и членами интерфейса. Если не пользуетесь , то и интерфейс вам не нужен. То есть этот промежуточный слой вами не используется.

Цитата Сообщение от jetonz Посмотреть сообщение
Я решил изучить как разрабатывать 3-tier приложения
В моем понимании n-tier приложения - именно физически разделенные узлы одного большого приложения. ie распределенного, из n-узлов. Мы же с вами сейчас говорим просто о 2-tier, 2-х звенке (клиент - БД) и обсуждаем архитектуру внутри нее самой. Логическую. Так. Для ясности.

Цитата Сообщение от jetonz Посмотреть сообщение
Так же я понял что нужно отдельно иметь классы которые будут эти самые "entity" записывать в БД
Эти объекты называются репозиториями, которые выполняют CRUD-операции. Repository pattern.

Цитата Сообщение от jetonz Посмотреть сообщение
классы, которые по сути будут проекциями таблиц БД
Это и есть рабочие единицы вашего Bll - Объекты предметной области . И не надо им реализовать какие-то интерфейсы только потому что это объекты Bll. Есть конечно понятие маркерных интерфейсов, но вам пока это не нужно.
Почитайте ресурсы по указанной ссылке - часть вопросов отпадет. А то распинаться тут долго еще можно.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.11.2015, 20:31
Лучший ответ Сообщение было отмечено jetonz как решение

Решение

jetonz, Технически это можно решить через дженерик-интерфейс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public interface IEntity
    {
        
    }
 
    public interface IModel<T> where T : IEntity
    {
        bool InsertModel(T entity);
        bool DeleteModel(T entity);
        bool UpdateModel(T entity);
    }
 
    public class UserEntity : IEntity
    {
        
    }
 
    public class UserModel  : IModel<UserEntity>
    {
 
        public bool InsertModel(UserEntity entity)
        {
            //...
        }
 
        public bool DeleteModel(UserEntity entity)
        {
            //...
        }
 
        public bool UpdateModel(UserEntity entity)
        {
            //...
        }
    }
Другой вопрос - зачем вам это надо? В простейшем случае - это не нужно. Это может понадобится если у вас будет несколько разных DAL. Но как я понимаю, вы этого не планируете.

Цитата Сообщение от jetonz Посмотреть сообщение
А так как учусь "хорошему тону программирования"
Нет ничего хуже попыток прилепить паттерны, не понимая зачем они нужны. Жаль что это пытаются делать почти все. Когда у вас возникнет проблема - тогда делайте рефакторинг и применяйте нужный паттерн. Делать же паттерн не понимая зачем он нужен в данном приложении - не комильфо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2015, 20:31
Помогаю со студенческими работами здесь

Использование интерфейса без реализации
Добрый день. Подскажите, корректно ли использовать интерфейс не содержащий реализации для, скажем так, пометки класса, для последующей...

Пример закрытой реализации интерфейса
Помогите разобраться с примером. Разбираю пример из Шилдта, стр. 332, где устанавливается факт четности и нечетности числа: // Явная...

Замечание и критика по реализации интерфейса
Друзья, прошу подсказать, как можно более правильнее реализовать интерфейс. Жду здравой критики и разноса :popcorn: Взял для примера...

Ошибка при реализации интерфейса
Доброго дня. Пытаюсь создать список с данными для дальнейшего использования, но что-то делаю не так. В чём может заключаться проблема? ...

Класс, требующий реализации интерфейса
Класс, требующий реализации интерфейса Помогите разобраться. Пытаюсь изучить интерфейсы, пробую различные ситуации. Обратил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru