如何使用可处理整数或字符串值的泛型创建抽象基类?

时间:2017-02-01 16:45:47

标签: c# generics inheritance

我目前正在学习C#,并且我希望有一个其他类将继承的基本抽象类。

我的挑战是我想根据情况传入整数或字符串值。

目前,我可以使用通用IF来做到这一点,我不会限制泛型。但是,我认为不限制泛型可能是一种不好的做法?如果这是一个不好的做法,我将如何约束通用,以便我只采用整数或字符串。

以下是我尝试做的一个例子:

/*
I want to have a base abstract class that can handle
both an integer value and a string value
*/
public abstract class Characteristic<T> where T : int, string {
    private T _value;

    public T Value {
        get { return _value;}
        set { _value = value;}
    }
}

public class NumericAttribute : Characteristic<int> {
    private int _modifiedValue = Value + 1;
}

public class StringAttribute : Characteristic<string> {
    private string _modifiedValue = Value + " more text.";
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

无法将通用类限制为intstring

  • 没有“只是这些类”约束
  • intstring不共享任何对其唯一的公共基类或接口
  • intstructstringclass - 所以即使按struct / class约束缩小选择也是不可能的。

所以基本上没有类型约束的通用(如果确实需要,可能在运行时检查类型)是这两种类型可以获得的最佳通用类型。对于不限制类型参数的泛型,没有什么特别的错误(即List<T>)。

如果你想要缩小类型至少intstring确实有一些共享接口 - IComparableIConvertible(非通用一次),但这些接口由所有数字类型实现,例如。

注意:有类似的问题试图将泛型限制为“数字类型”,这可能会提供一些替代方法(包括代码生成)。即Is there a constraint that restricts my generic method to numeric types?

答案 1 :(得分:2)

可能或多或少做你所要求的事情;但正如其他人已经指出的那样,你可能不会想要这样做(甚至可能不会需要约束)。但是,正如我在评论中指出的那样,你创建了一个界面

public interface IModifiable<T>
{
    T Modify(T value);
}

然后你自己的intstring的包装器类实现了这个接口:

public struct Int32 : IModifiable<Int32>
{
    public System.Int32 Value { get; set; }

    public Int32 Modify(Int32 value)
    {
        return new Int32() { Value = Value + value.Value };
    }
}

public class String : IModifiable<String>
{
    public System.String Value { get; set; }

    public String Modify(String value)
    {
        return new String() { Value = Value + value.Value };
    }
}

您的基类现在有一个界面约束

public abstract class Characteristic<T> where T : IModifiable<T>
{
    private T _value;

    public T Value
    {
        get { return _value; }
        set { _value = value; }
    }
}

和派生类,几乎和以前一样

public class NumericAttribute : Characteristic<Int32>
{
    void f()
    {
        var _modifiedValue = Value.Modify(new Int32() { Value = 1 });
    }
}

public class StringAttribute : Characteristic<String>
{
    void f()
    {
        var _modifiedValue = Value.Modify(new String() { Value = " more text." });
    }
}

再次,虽然这给你一个&#34;解决方案&#34;对于您的具体问题,您可能会考虑这种方法的智慧。