Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 72
1

Нужен совет по ООП

14.11.2013, 22:05. Показов 1251. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я в ООП новичек и с наследованиями, абстрактными классами, интерфейсами и прочими ООП диковинами раньше дел не имел, поэтому и решил спросить совета.
Как пример возмем игру.
Все игровые предметы имеют некоторый набор общих свойтв таких как локализация, время жизни, регенерация , способность двигаться.

например поверхность земли имеет только "локализацию" - координаты на карте и номер текстуры
бревно помимо своих координат еще имеет "время жизни" - через сколько времени оно будет удалено из игры
дерево время жизни неимеет , оно растет пока его несрубят. Зато оно имеет "регенерацию" - типа количество древесины ,которое можно полуит с этого дерева постояно увеличиваеться.
грядка огорода имеет и локализацию и регенирацию и время жизни(типа если за огородом неследить он пропадет)
всякие там монстры умеют двигаться, однако некоторыем из них имеют "регенерацию" а другие нет. также и время жизни у одних есть а у других нет а некоторые имеют и то и другое.


Причем реализация ВСЕХ методов/функций в этих блоках одинакова для всех классов
например некий метов уничтожения обекта описаный в блоке "время жизни" обсолютно идентичен для любого оъекта , вне зависимости от его класса.
Грубо говоря луюбой класс игровых обектов можно составить из комбинаций этих "блоков"

Что тут лучше подойдет интерфейсы, абстрактные классы или что другое?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2013, 22:05
Ответы с готовыми решениями:

ООП и БД. Нужен совет, пояснение по архитектуре
Добрый день, друзья. При попытке написания теплого, правильного, лампового кода для приложения с бд...

ООП, программа склад, застрял, нужен совет
Всем привет, пишу не большую программку типа склада, есть 3 поля (наименование,цена и кол-во,есть...

Нужен совет в выборе темы для курсовой по ООП. 2 курс
Здравствуйте. Извиняюсь что пишу в основном разделе. Я только перешел на 2 курс. У нас новый...

Совет ООП
Здравствуйте, подскажите пожалуйста сайт или другой источник по ООП. Уже неделю бьюсь и не понимаю...

18
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
14.11.2013, 22:30 2

Не по теме:

Цитата Сообщение от Figga Посмотреть сообщение
локализация
Цитата Сообщение от Figga Посмотреть сообщение
локализацию
ахахахах, спасибо за минутку смеха :D. Если Вы имели в виду положение в пространстве - это скорее локация)))


по сабжу, решение, предложенное Вами слишком примитивно для создания интерфейсов. А тем более, если реализация методов одинакова для всех объектов, можно обойтись обычными классами с наследованием.
0
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 72
14.11.2013, 23:41  [ТС] 3
Цитата Сообщение от rattrapper Посмотреть сообщение

Не по теме:



ахахахах, спасибо за минутку смеха :D. Если Вы имели в виду положение в пространстве - это скорее локация)))


по сабжу, решение, предложенное Вами слишком примитивно для создания интерфейсов. А тем более, если реализация методов одинакова для всех объектов, можно обойтись обычными классами с наследованием.
Да я как бы и хотел наследоваться, но хз как.
у меня 4-6 базовых блоков и их нада както "скрестить" а наследование происходит поцепочке один за другим (если я правильно разобрался) в итоге я могу скрестить 2 класса но как к ним добавить третий?



тоесть есть классы A B C D нада сделать
AB AC AD ABC ABD ABCD BC BD BCD и т д

Добавлено через 12 минут
Цитата Сообщение от Figga Посмотреть сообщение
ахахахах, спасибо за минутку смеха . Если Вы имели в виду положение в пространстве - это скорее локация)))
причина вашего веселья невполне ясна =) http://ru.wiktionary.org/wiki/локализация
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
14.11.2013, 23:51 4
Не стоит мешать слонов с бегемотами. Локации отдельно, объекты отдельно.
Что касается объектов, мне думается так: абстрактрый класс ИгровойОбъект с набором самых общих методов и свойств, а от него наследуются к примеру Мобы, НПС, и так далее по иерархии, с реализацией нужных интерфейсов IMovable, IDestroyable и пр.
0
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 72
15.11.2013, 00:08  [ТС] 5
Цитата Сообщение от Kruds Посмотреть сообщение
Не стоит мешать слонов с бегемотами. Локации отдельно, объекты отдельно.
Что касается объектов, мне думается так: абстрактрый класс ИгровойОбъект с набором самых общих методов и свойств, а от него наследуются к примеру Мобы, НПС, и так далее по иерархии, с реализацией нужных интерфейсов IMovable, IDestroyable и пр.
меня ставит в некоторое затруднение отсутствие полей у интрефейсов.
для тогоже IDestroyable требуется несколько новых переменых, чтобы знать через какое время объект уничтожается, взрыветсяли он при уничтожении, или там чтонибуть еще.
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
15.11.2013, 00:17 6
Все это (задержка, взрыв) уже реализация метода для конкретного класса, зачем поля?
1
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 72
15.11.2013, 00:30  [ТС] 7
Цитата Сообщение от Kruds Посмотреть сообщение
Все это (задержка, взрыв) уже реализация метода для конкретного класса, зачем поля?
ну допустим будет много игровых обектов и их время уничтожения будет разное
бревно исчезнет через час
камень через 2
гравицапа исчизает через 3

не делатьже под каждое именование игрового предмета новый класс со своей реализацией интерфейса, ведь они отличаются только номиром рисунка который будет отображен на экране
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
15.11.2013, 04:45 8
Я совершенно не вникал, что там будет каждый тип объекта "уметь" в игре, и как работать, просто, к примеру написал. Предположим, что метод Destroy() вызывает в игре видимое уничтожение объекта, а не удаление из памяти...

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
    public interface IDestroyable
    {
        void Destroy();
    }
 
    public abstract class DecorationObject
    {
        protected DecorationObject(int lifeTime, int regeneration)
        {
            LifeTime = lifeTime;
            Regeneration = regeneration;
        }
 
        public int Regeneration { get; protected set; }
 
        public int LifeTime { get; protected set; }
    }
 
    public class Tree : DecorationObject, IDestroyable
    {
        public Tree(int lifeTime, int regeneration) 
            : base(lifeTime, regeneration)
        {
        }
 
        public void Destroy()
        {
        }
    }
Добавлено через 16 минут
Или, возможно, что-то типа того:
GameObjectBase - любой игровой объект, который имеет здоровье и время жизни. CharacterBase - все персонажи, которые будут уметь передвигаться.
Вообще, думаю, во время написания игры станет ясно, что от кого наследует, у кого какие должны быть хар-ки, я тут наугад побыстрому набросал, так что думай сам.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    public interface IDestroyable
    {
        void Destroy();
    }
 
    public interface IMovable
    {
        void Move(double x, double y);
    }
 
    public abstract class GameObjectBase : IDestroyable
    {
        protected double _hp;
        protected int _regeneration;
        protected int _lifeTime;
 
        protected GameObjectBase(int lifeTime, int regeneration, double hp)
        {
            if (lifeTime < 0)
                throw new ArgumentException("lifeTime");
            if (lifeTime < 0)
                throw new ArgumentException("regeneration");
            if (hp < 0d)
                throw new ArgumentException("hp");
 
            _lifeTime = lifeTime;
            _regeneration = regeneration;
            _hp = hp;
        }
 
        public double HP
        {
            get { return _hp; }
            set { _hp = value; }
        }
 
        public int Regeneration { get { return _regeneration; } }
 
        public int LifeTime { get { return _lifeTime; } }
 
        public virtual void Destroy()
        {
            _regeneration = 0;
            _lifeTime = 0;
            _hp = 0d;
        }
    }
 
    public abstract class CharacterBase : GameObjectBase, IMovable
    {
        protected double _x, _y;
 
        protected CharacterBase(int lifeTime, int regeneration, double hp) 
            : base(lifeTime, regeneration, hp)
        {
        }
 
        public virtual void Move(double x, double y)
        {
            _x = x; 
            _y = y;
        }
    }
 
    public class Tree : GameObjectBase
    {
        public Tree(int lifeTime, int regeneration, double hp)
            : base(lifeTime, regeneration, hp)
        {
        }
    }
Добавлено через 28 минут
Кстати, обнаружил небольшой косяк даже для этого примера. Это:
C#
1
2
3
        private double _hp;
        private int _regeneration;
        private int _lifeTime;
должно быть не private, а скорее всего protected. Сразу исправлю его .
1
0 / 0 / 1
Регистрация: 09.11.2013
Сообщений: 72
16.11.2013, 05:27  [ТС] 9
Casper-SC
Большое спасибо ! Кажись я уже начинаю немного( совсем чуть-чуть) шарить в ООП =)
Но возникает вопрос, Не совсем по этой теме но всеже очень важный для меня

ООП походу негативно влияет на скорость работы програмы. Таже инкапсуляция через функцию обращается к полю , и походу копирует его в свойство.
C#
1
2
3
4
5
public double HP
        {
            get { return _hp; }
            set { _hp = value; }
        }
Хотелосьбы спросить умудренных опытом програмеров
Стоит ли в моем случае (при создании игры где будут сотни тысящ экземпляров классов и постояные изменения над ними) использовать ООП????

и какую пользу ООП может принести при создании игры( может некоторую защиту от всяких там Артмони или еще что)
0
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
16.11.2013, 10:37 10
ООП дает скорость написание программы . Насчет свойств обращайтесь напрямую к полю, но это не в духе ооп. Функция дает проверить корректность ввода и или преобразовать вывод . Например если время хранится в секундах, то в get можно разделить его на 3600 и вернуть часы.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.11.2013, 00:07 11
Figga, не путаем мух с котлетами. ООП на скорость не влияет - все конвертится в тот же ассемблер, что и С++, и все остальное.

Что касается вашего утверждения:
тоесть есть классы A B C D нада сделать
AB AC AD ABC ABD ABCD BC BD BCD и т д
как сказали, так и делайте. Чтобы добиться такого поведения, не надо, а вернее вредно наследовать их один от другого. Что мешает сделать так?

C#
1
2
3
4
5
6
class A
{
   public B b;
   public C c;
   public D d;
}
? Все комбинации должны быть комбинациями существующих классов, а не высосаны из пальца с однотипными методами и полями...
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.11.2013, 21:04 12
Цитата Сообщение от Figga Посмотреть сообщение
ООП походу негативно влияет на скорость работы програмы. Таже инкапсуляция через функцию обращается к полю , и походу копирует его в свойство.
Цитата Сообщение от Figga Посмотреть сообщение
Стоит ли в моем случае (при создании игры где будут сотни тысящ экземпляров классов и постояные изменения над ними) использовать ООП????
Нейгел К., Ивьен Б., Глинн Дж., Уотсон К. C# 4.0 и платформа .NET4 для профессионалов - 2011
Читай "Замечание о встраивании" (см. картинку):
Нужен совет по ООП
0
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241
21.11.2013, 00:56 13
Цитата Сообщение от Figga Посмотреть сообщение
Что тут лучше подойдет интерфейсы, абстрактные классы или что другое?
Цитата Сообщение от Figga Посмотреть сообщение
Большое спасибо ! Кажись я уже начинаю немного( совсем чуть-чуть) шарить в ООП =)
Но возникает вопрос, Не совсем по этой теме но всеже очень важный для меня
ООП походу негативно влияет на скорость работы програмы. Таже инкапсуляция через функцию обращается к полю , и походу копирует его в свойство.
2-3 толстые прочитанные книги дадут ответ и позволят не задавать глупый вброс: ООП походу негативно влияет на скорость работы програмы
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.11.2013, 02:22 14
Casper-SC, насчет инлайнинга - неправда.
C#
1
[MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
насчет производительности - это такая ерунда, что обращать внимание на производительность ООП перестали еще 20 лет назад. Только во времена доса и 640кб, которых хватит всем, это могло как-то влиять - лишние указатели на базовые типы и тд. И то С++ был создан уже в 70гг, за 20 лет до доса.
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
21.11.2013, 02:29 15
Цитата Сообщение от Psilon Посмотреть сообщение
Casper-SC, насчет инлайнинга - неправда.
Книга по C# 4.0 и платформа .NET4

А MethodImplOptions.AggressiveInlining есть только в .NET 4.5
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.11.2013, 02:44 16
Casper-SC, ну так я и не говорю, что в книге фигню написали, я говорю, что на данный момент это неправда
0
145 / 45 / 16
Регистрация: 10.10.2013
Сообщений: 110
21.11.2013, 02:53 17
Цитата Сообщение от Psilon Посмотреть сообщение
С++ был создан уже в 70гг
брехня вики :

Тип исполнения: компилируемый
Появился в: 1983
Автор(ы): Бьёрн Страуструп
1
Эксперт функциональных языков программированияЭксперт Java
4539 / 2732 / 486
Регистрация: 28.04.2012
Сообщений: 8,628
21.11.2013, 10:16 18
Цитата Сообщение от Courage Посмотреть сообщение
брехня
Но тем не менее есть еще Simula например.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.11.2013, 11:54 19
Courage, да, что-то с памятью моей стало
А дельфи в 86 вроде бы.

Добавлено через 1 минуту
Точнее object pascal
0
21.11.2013, 11:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2013, 11:54
Помогаю со студенческими работами здесь

совет по ооп Delphi 7
Задание такое:Реализовать программу сбора елки из треугольников. Используя объектные структуры,...

Дать совет по ООП
Скажите, на какой вид проектов на студии 2005 стоит переходить после изучения полностью консоли на...

[ ООП С++(да вообще побоку на язык) ] Дайте совет по поводу реализации курсача, просто пару мыслей
ООП С++ хорошо знаю, но вот зараза попала тема &quot;спорная&quot; так сказать, &quot;Разработка программы...

Нужен пример использования ООП
Вот ООП в JavaScript есть, но каким боком его можно использовать? Я еще не сталкивался с такими...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru