Как я могу использовать атрибут маркера вместо интерфейса маркера? - PullRequest
0 голосов
/ 24 января 2019

Я много читал о плохих интерфейсах маркеров (или нет, кажется, это не так ясно).

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

У меня есть интерфейс для определения Robot, а другой - для определения Ninja.Оказывается, что существует класс Foo, который может умножать вещи, но только с помощью кого-то, кто одновременно является Robot И Ninja.

using System;

public class Program
{
    public static void Main()
    {
        IRobotNinja robotNinja = new RobotNinjaAlways10();
        Foo foo = new Foo();
        Console.WriteLine(foo.Multiply(1, 1, robotNinja));
    }
}

public class Foo
{
    public int Multiply(int leftOperand, int rightOperand, IRobotNinja robotNinja)
    {
        return leftOperand * rightOperand * robotNinja.availableShuriken * robotNinja.batteryLevel;
    }
}

public interface IRobot
{
    int batteryLevel
    {
        get;
    }
}

public interface INinja
{
    int availableShuriken
    {
        get;
    }
}

public interface IRobotNinja : IRobot, INinja
{
}

public class RobotNinjaAlways10 : IRobotNinja
{
    public int batteryLevel
    {
        get
        {
            return 10;
        }
    }

    public int availableShuriken
    {
        get
        {
            return 10;
        }
    }
}

Я понимаю, чтоIRobotNinja - это маркерный класс: в нем нет членов.

Как получить то же самое (и, в частности, обеспечить во время компиляции, что только Robot / Ninja поможет сMultiply

1 Ответ

0 голосов
/ 24 января 2019

Чтобы избежать создания другого интерфейса, вы можете сделать Multiply универсальным с ограничениями :

public class Foo
{
    public int Multiply<T>(int leftOperand, int rightOperand, T robotNinja)
         where T : IRobot, INinja
    {
        return leftOperand * rightOperand * robotNinja.availableShuriken
                           * robotNinja.batteryLevel;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...