Я много читал о плохих интерфейсах маркеров (или нет, кажется, это не так ясно).
Я не совсем понимаю, как работают атрибуты маркеров, и я создал небольшойПример для иллюстрации моих проблем:
У меня есть интерфейс для определения 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