110 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
 | 
						|
namespace Engine.Core;
 | 
						|
 | 
						|
public abstract class BaseEntity : IEntity
 | 
						|
{
 | 
						|
    public Event<IIdentifiable, IIdentifiable.IdChangedArguments> OnIdChanged { get; } = new();
 | 
						|
    public Event<IInitializable> OnInitialized { get; } = new();
 | 
						|
    public Event<IInitializable> OnFinalized { get; } = new();
 | 
						|
    public Event<IHasStateEnable> OnStateEnableAssigned { get; } = new();
 | 
						|
    public Event<IAssignable> OnUnassigned { get; } = new();
 | 
						|
 | 
						|
    private IStateEnable _stateEnable = null!;
 | 
						|
 | 
						|
    private bool _initialized = false;
 | 
						|
    private string _id = string.Empty;
 | 
						|
 | 
						|
    public virtual IStateEnable StateEnable => _stateEnable;
 | 
						|
 | 
						|
    public string Id
 | 
						|
    {
 | 
						|
        get => _id;
 | 
						|
        set
 | 
						|
        {
 | 
						|
            if (IsInitialized)
 | 
						|
                throw new($"Can't change {nameof(Id)} of {_id} because it's initialized");
 | 
						|
 | 
						|
            if (value == _id)
 | 
						|
                return;
 | 
						|
 | 
						|
            string previousId = _id;
 | 
						|
 | 
						|
            _id = value;
 | 
						|
            OnIdChanged?.Invoke(this, new(previousId));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public bool IsInitialized
 | 
						|
    {
 | 
						|
        get => _initialized;
 | 
						|
        private set
 | 
						|
        {
 | 
						|
            if (value == _initialized)
 | 
						|
                return;
 | 
						|
 | 
						|
            _initialized = value;
 | 
						|
            if (value)
 | 
						|
                OnInitialized?.Invoke(this);
 | 
						|
            else
 | 
						|
                OnFinalized?.Invoke(this);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    protected virtual void OnAssign(IStateEnable stateEnable) { }
 | 
						|
    public bool Assign(IStateEnable stateEnable)
 | 
						|
    {
 | 
						|
        if (IsInitialized)
 | 
						|
            return false;
 | 
						|
 | 
						|
        _stateEnable = stateEnable;
 | 
						|
        _stateEnable.Assign(this);
 | 
						|
        OnAssign(stateEnable);
 | 
						|
        OnStateEnableAssigned?.Invoke(this);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    protected virtual void UnassignInternal() { }
 | 
						|
    public bool Unassign()
 | 
						|
    {
 | 
						|
        if (IsInitialized)
 | 
						|
            return false;
 | 
						|
 | 
						|
        UnassignInternal();
 | 
						|
 | 
						|
        _stateEnable = null!;
 | 
						|
        _stateEnable.Unassign();
 | 
						|
        OnUnassigned?.Invoke(this);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    protected virtual void InitializeInternal() { }
 | 
						|
    public bool Initialize()
 | 
						|
    {
 | 
						|
        if (IsInitialized)
 | 
						|
            return false;
 | 
						|
 | 
						|
        _stateEnable ??= Factory.StateEnableFactory.Instantiate(this);
 | 
						|
 | 
						|
        InitializeInternal();
 | 
						|
 | 
						|
        IsInitialized = true;
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    protected virtual void FinalizeInternal() { }
 | 
						|
    public bool Finalize()
 | 
						|
    {
 | 
						|
        if (!IsInitialized)
 | 
						|
            return false;
 | 
						|
 | 
						|
        FinalizeInternal();
 | 
						|
 | 
						|
        IsInitialized = false;
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    protected BaseEntity() => _id = Guid.NewGuid().ToString("D");
 | 
						|
    protected BaseEntity(string id) => _id = id;
 | 
						|
}
 |