EADever Ответов: 1

Как сделать то же самое в C# на основе java-кода?


У меня есть такая модель java:

public class AttackCalcObserver {

	public boolean checkStatus(AttackStatus status) {
		return false;
	}

}


public class AttackStatusObserver extends AttackCalcObserver {

	protected int value;
	protected AttackStatus status;

	/**
	 * @param value
	 * @param status
	 */
	public AttackStatusObserver(int value, AttackStatus status) {
		this.value = value;
		this.status = status;
	}
}


основной класс:

public class AlwaysDodgeEffect {

	public void startEffect(final Effect effect) {
		AttackCalcObserver acObserver = new AttackStatusObserver(value, AttackStatus.DODGE) {

			@Override
			public boolean checkStatus(AttackStatus status) {
				if (status == AttackStatus.DODGE) {
					if (value <= 1)
						effect.endEffect();
					else
						value--;

					return true;
				}
				else
					return false;
			}

		};
	}

}


Что я уже пробовал:

это то, что я пробовал в c#. Классы AttackCalcObserver и AttackStatusObserver одинаковы в java.

так что это всегда класс Dodgeeffect в c#:

public class AlwaysDodgeEffect
    {
        public override void startEffect(Effect effect)
        {
            AttackCalcObserver acObserver = new AttackStatusObserver(value, AttackStatus.DODGE)
            {
                //what i need todo here?
            };
        }
    }

Richard MacCutchan

Я думаю, что вам нужно будет использовать события и делегатов, чтобы достичь того же эффекта.

EADever

Можете ли вы привести мне пример?

Richard MacCutchan

Ramza360 дал вам один из них ниже. Или вы можете посмотреть образцы по адресу С# Уроки (С#)[^].

1 Ответов

Рейтинг:
2

Ramza360

Это можно довольно легко сделать с помощью делегатов.

Пример:

public delegate boolean CheckStatusDelegate(AttackStatusObserver observer);

public class AttackStatusObserver {
        protected int value;    
        protected AttackStatus status;
        protected CheckStatusDelegate statusDelegate;

        public int Value {
            get { return this.value; }
            set { this.value = value; }
        }

        public AttackStatus Status {
            get { return this.status; }
        }

	/**
	 * @param value
	 * @param status
	 */
	public AttackStatusObserver(int value, AttackStatus status, CheckStatusDelegate statusDelegate) {
		this.value = value;
		this.status = status;
	        this.statusDelegate = statusDelegate;
        }

        public override bool checkStatus(int value, AttackStatus status) {
            if (null != statusDelegate) {
                // Only do return if you do not wish to process anything else
                return statusDelegate(this);
            }

            // otherwise process normal checkStatus
            //
        }
}

public class AlwaysDodgeEffect {
    public override void startEffect(Effect effect) {
        AttackCalcObserver acObserver = new AttackStatusObserver(value, AttackStatus.DODGE, CheckStatusCallback);
        // Alternatively you can have an event or even the constructor call this internally.
        acObserver.checkStatus(AttackStatus.DODGE);
    }

    private bool CheckStatusCallback(AttackStatusObserver observer) {
        if (observer.AttackStatus == AttackStatus.DODGE) {
           if (observer.Value <= 1)
                effect.endEffect();
           else
                observer.Value--;

           return true;
        }
        else
            return false;
    }
}


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