Приведение объекта класса к интерфейсу C#
Мне интересно, какие возможности дает приведение объекта класса к интерфейсу, который он реализует? Например:
public interface IOwner
{
int Owner { get; set; }
}
public interface IArmy
{
Army Army { get; set; }
}
public interface ITreasure
{
Treasure Treasure { get; set; }
}
public class Creep : IOwner, IArmy, ITreasure
{
public int Owner { get; set; }
public Army Army { get; set; }
public Treasure Treasure { get; set; }
}
и класс, который работает с ним:
public static class Interaction
{
public static void Make(Player player, object mapObject)
{
if (mapObject is IArmy)
if (player.CanBeat(((IArmy)mapObject).Army))
{
if (mapObject is IOwner)
((IOwner)mapObject).Owner = player.Id;
if (mapObject is ITreasure)
player.Consume(((ITreasure)mapObject).Treasure);
}
Так что теперь, когда я называю эту строку: (player.CanBeat(((IArmy)mapObject).Army))
получить доступ к полю армии из класса mapObject? Это явно не поле интерфейса, так как мы не можем с ними работать. Спасибо за совет!
1 ответ
Когда вы разыгрываете mapObject
в IArmy
интерфейс все еще остается mapObject
класс (ползучесть) внутри, но вы можете назвать только то, что подразумевается IArmy
интерфейс.
Если вы спросите, почему и как это можно использовать: вы можете создать другой класс, который реализует IArmy
интерфейс и когда вы приведете его к IArmy
вы можете обрабатывать его так же, как и другие классы, которые его реализуют.