构造函数对泛型参数的要求?

问题描述

| 看着这个问题,我开始考虑如何在C#中处理构造函数需求。 假设我有:
T SomeMethod<T>(string s) : where T : MyInterface
{
    return new T(s);
}
我想对ѭ1进行设置,使其可以由字符串构造,但据我所知,构造函数定义不允许作为接口的一部分。是否有解决此问题的标准方法?     

解决方法

在界面中添加init方法或属性,
public interface MyInterface
{
    void Init(string s);
    string S { get; set; }
}

T SomeMethod<T>(string s) : where T : MyInterface,new()
{
    var t = new T();
    t.Init(s);

    var t = new T
    { 
        S = s
    };

    return t;
}
由于无法指定构造函数约束的参数     ,另一种方法是动态调用构造函数:
// Incomplete code: requires some error handling
T SomeMethod<T>(string s) : where T : MyInterface
{
    return (T)Activator.CreateInstance(typeof(T),s);
}
这样做的问题是您失去了类型安全性:如果尝试将其与没有匹配构造函数的MyInterface实现一起使用,它将抛出异常。     ,如果要使其具有接受字符串输入的构造函数,则需要实现一个抽象类:
public abstract class BaseClass<T>
{
     public BaseClass<T>(string input)
     {
         DoSomething(input);
     }

     protected abstract void DoSomething(string input);
}
然后,您的派生类仅提供抽象方法的实现,然后可以选择所需的任何接口。
public class Sample<T> : BaseClass<T>,IMyInterface
{
    public Sample<T>(string input)
       : base(input)
    {
    }

    protected override void DoSomething(string input)
    {
    }

    public void MyInterfaceMethod()
    {
    }
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...