Закрытое расширение класса


Мы обратили внимание на то, что некоторые из наших мододелов запрашивают обходной путь для расширения закрытых классов. В этой статье мы исследуем, почему в игровых кодах есть запечатанные классы и как добиться для них расширенного поведения.

Одна из основных причин, по которой мы сделали фундаментальные классы закрытыми, - это позволить кодовой базе поддерживать широкий спектр модов, которые могут работать одновременно с максимальной эффективностью. Для достижения этой цели и в соответствии с принципами разработки программного обеспечения мы рекомендуем создавать моды как автономные, модульные расширения кода, такие как поведение кампании, игровые модели, а также пользовательские классы или компоненты, которые можно добавлять или удалять без каких-либо осложнений. Наследование от основных классов кампании увеличивает вероятность конфликтов с другими модами и будущими официальными обновлениями из-за изменения иерархии классов и может привести к индивидуальным изменениям фундаментальной логики игры. Хотя можно написать аккуратный код, который избегает этих проблем.

Когда речь идет о достижении расширенного поведения для герметизированных классов без наследования, хотя могут быть изучены различные обходные пути, одно из возможных решений обсуждается ниже.

По сути, когда проблема расширения закрытых классов решена, необходимо решить два основных требования, а именно: добавление нового поведения и добавление новых свойств.

Чтобы добавить новое поведение к закрытых классам, можно использовать функцию C#, называемую «методами расширения». Короче говоря, он позволяет добавлять новые методы к любому классу без создания нового типа или изменения исходного. Для получения дополнительной информации о методах расширения вы можете посетить:
https://docs.microsoft.com/en-us/do...g-guide/classes-and-structs/extension-methods.

Добавление нового свойства может быть достигнуто путем связывания экземпляра запечатанного класса с соответствующим значением свойства с помощью словаря. В сочетании с методами расширения запечатанный класс может предоставить интерфейс для нового свойства, как если бы оно было добавлено непосредственно в класс.

Код:
    public class HeroManaExtensionCampaignBehavior : CampaignBehaviorBase
    {
        private Dictionary<Hero, float> _heroManaValues = new Dictionary<Hero, float>();
    
        public float GetMana(Hero hero)
        {
            if(_heroManaValues.TryGetValue(hero, out float result))
            {
                return result;
            }            
            
            return 0; //default value
        }

        public void SetMana(Hero hero, float newValue)
        {
            _heroManaValues[hero] = newValue;
        }

        public override void RegisterEvents(){ }        
        public override void SyncData(IDataStore dataStore)
        {
            dataStore.SyncData("_heroManaValues", ref _heroManaValues);
        }
    }

    public static class HeroManaExtensions
    {         
        public static float GetMana(this Hero hero)
        {
            var behavior = Campaign.Current.GetCampaignBehavior<HeroManaExtensionCampaignBehavior >();
            return behavior.GetMana(hero);
        }

        public static void SetMana(this Hero hero, float newMana)
        {
            var behavior = Campaign.Current.GetCampaignBehavior<HeroManaExtensionCampaignBehavior >();

            behavior.SetMana(hero, newMana);
        }
    }

Хотя это решение является жизнеспособным обходным путем для расширения закрытых классов, важно помнить, что каждый проект имеет разные требования, и, следовательно, вам следует изучить, какой подход лучше всего подходит для вашего кода.




- используйте эту кнопку если вы обнаружили ошибку/искажение содержимого/отсутствие контента в новости или если хотите сообщить администрации о выходе новой версии мода и т.п.

Комментариев 0

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Онлайн

Сейчас на сайте: 21
Гостей: 19

Пользователи: 
- отсутствуют

Последние комментарии

Mount & Blade - Эпоха турниров (Warband) 1.174
Tijuuan, 20 мая 2024 06:22
Приветствую Всех Какая то проблема появилась(Или она и была раньше,может я не знаю) в русификаторе...
MOD WW II China War of Elders
сигма, 19 мая 2024 19:49
Кто нибудь подскажите как решить ошибку unable to get technique specular_alpha_skin....
MOD Warsword Conquest Winds of Magic Edition Beta
Yang Kai, 19 мая 2024 13:01
LoudPanther,Русификатор на Orc Edition  обновился еще в Сентябре, а    А фикс багов выше для Orc...
Гайд на MOD WIND OF THE WAR - NEW ERA 74FIX8
Yang Kai, 19 мая 2024 12:54
Lostoul,Здесь мертво всё Да и какой смысл играть на древней версии? На данный момент самая новая...
MOD War in the world of magic. Era_Dragons
Lostoul, 17 мая 2024 03:50
Есть тут ещё кто живой? я начал играть в этот мод, но возникла проблема в том что я не могу понять...
Гайд на MOD WIND OF THE WAR - NEW ERA 74FIX8
Lostoul, 17 мая 2024 03:47
Есть тут ещё кто живой? я начал играть в этот мод, но возникла проблема в том что я не могу понять...
Помогите найти мод! (все вопросы с подборкой модификаций - сюда)
Deznortennus, 14 мая 2024 18:34
Tijuuan,их много. самый базовый - diplomacy или diplomacy litdum.4 . Также remasterd. знаю еще...
MOD Warsword Conquest Winds of Magic Edition Beta
Джаддар, 13 мая 2024 17:27
Здравствуйте, этот мод использовать как сабмод к "warsword conquest prewiew mod",или же можно...
MOD East 1135
Lossarin, 10 мая 2024 12:11
iskanderzp, в том то и дело, что в других модах этой проблемы нет. только здесь, то мое же...