Как имитировать параметры шаблона, не относящиеся к типу, в C# для универсальных классов для обеспечения безопасности тиC#

Место общения программистов C#
Ответить
Anonymous
 Как имитировать параметры шаблона, не относящиеся к типу, в C# для универсальных классов для обеспечения безопасности ти

Сообщение Anonymous »

Есть ли способ обработки целых чисел, например. 3 и 5 как отдельные типы с дополнительным свойством, являющимся значением, которое они представляют? В частности, я хочу, чтобы Modulo отличался от Modulo, чтобы предотвратить их совместное использование в операции, которая работает с несколькими Modulo.
Я объясню свой вариант использования. Извините, если это математически некорректно, но я думаю, что это хорошо иллюстрирует мою точку зрения.

Код: Выделить всё

public interface IBase
{
static abstract int Base { get; }
}

public class FiveBase : IBase
{
public static int Base { get; } = 5;
}

public class SevenBase : IBase
{
public static int Base { get; } = 7;
}

public class ModuloHardcoded where T : IBase
{
int value;

public ModuloHardcoded(int value)
{
this.value = value;
}

public ModuloHardcoded Add(ModuloHardcoded other)
{
return new ModuloHardcoded((value + other.value) % T.Base);
}
}
Приведенный выше код позволяет нам создавать объекты ModuloHardcoded с определенной целочисленной базой. Хотя все объекты ModuloHardcoded имеют доступ к одним и тем же методам и свойствам, они могут взаимодействовать только с другими объектами того же типа T таким же образом, как List и List< /code> различны. Проблема с вышеописанным подходом заключается в том, что для каждой поддерживаемой базы требуется новый класс, тогда как я хочу поддерживать все целочисленные базы по умолчанию. В идеале мне нужно что-то похожее на то, что показано ниже.

Код: Выделить всё

// T will be an integer here
public class Modulo
{
int value;

public Modulo(int value)
{
this.value = value;
}

// The below is not possible since T is a type and not an int
public Modulo Add(Modulo other)
{
return new Modulo((value + other.value) % T);
}

}
Из этого вопроса я знаю, что нечто подобное возможно в cpp и невозможно в C#, но я попытался предоставить больше контекста, показывающего, где может потребоваться такая функция. Как я могу добиться безопасности типов во время компиляции, не позволяя мне добавлять два несовместимых объекта? Я понимаю, что могу просто добавлять поля и свойства и выполнять проверки во время выполнения, но мне кажется, что решение, использующее проверку типов, было бы более элегантным. Вся моя предпосылка ошибочна, возможно, есть более простой способ реализовать желаемое поведение.

Подробнее здесь: https://stackoverflow.com/questions/787 ... lasses-for
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»