2

我希望能够向用户提供一个选择——是使用 16 位索引(在 OpenGL 中)还是 32 位索引。在 C++ 中,我可能只是为 int 或 short 创建一个别名,但我似乎在 C# 中没有选项。基本上我的目标可以总结在下面的课程中:

using System;

namespace Something
{
    public class Conditional
    {
        public Conditional(Boolean is16Bit)
        {
            if (is16Bit)
            {
                SOMETYPE is Int16
            }
            else
            {
                SOMETYPE is Int32
            }
        }

        private List<SOMETYPE> _something;
    }
}

别名(如果可以的话)会好很多——我只是不想强迫任何人使用这段代码编写#define语句,这可能吗?

谢谢

4

2 回答 2

3

似乎您可以为此使用泛型:

namespace Something
{
    public class Conditional<T>
    {
        private List<T> _something = new List<T>();
        private Conditional()
        {
            // prevents instantiation except through Create method
        }

        public Conditional<T> Create()
        {
            // here check if T is int or short
            // if it's not, then throw an exception

            return new Conditional<T>();
        }
    }
}

并创建一个:

if (is16Bit)
    return Conditional<short>.Create();
else
    return Conditional<int>.Create();
于 2013-07-14T17:49:07.567 回答
1

您可以使用接口和工厂,如下所示:

public interface IConditional
{
    void AddIndex(int i);
}

private class Conditional16 : IConditional
{
    List<Int16> _list = new List<Int16>();

    public void AddIndex(int i)
    {
        _list.Add((short)i);
    }
}

private class Conditional32 : IConditional
{
    List<Int32> _list = new List<Int32>();

    public void AddIndex(int i)
    {
        _list.Add(i);
    }
}

public static class ConditionalFactory
{
    public static IConditional Create(bool is16Bit)
    {
        if (is16Bit)
        {
            return new Conditional16();
        }
        else
        {
            return new Conditional32();
        }
    }
}

你的代码(和它的调用者)可以做任何事情,IConditional而不用关心它是什么具体的表示。

于 2013-07-14T18:03:55.450 回答