使用這個通用基類:
public abstract class Logic<U> where U : class
{
protected U m_provider;
public Logic(U provider)
{
m_provider = provider;
}
}
我正在嘗試為單元測驗創??建一個基本測驗類:
public class LogicBaseTest<T, U> where T : Logic <U>, new() where U: class
{
protected T m_logic;
protected U m_provider;
[OneTimeSetUp]
public virtual void OneTimeSetup()
{
m_provider = (U)Substitute.For<IInterface>();
m_logic = new T(m_provider);
}
}
它抱怨建構式,它請求 new() 約束,但是當我添加它時,它抱怨建構式不能接受引數。
我可以添加一個方法來填充提供程式,但我想知道它是否可以在建構式中完成。
uj5u.com熱心網友回復:
所以你在這里有兩個問題:
- LogicBaseTest 需要知道如何實體化一個
Logic<U>. Logic<U>在建構式中需要 aU。
我建議的解決方案是將工廠委托傳遞給基測驗類并洗掉new()要求。然后您的設定可以Logic使用工廠構造類:
public class LogicBaseTest<T, U>
where T : Logic<U>
where U: class
{
protected readonly Func<U, T> _factory;
public LogicBaseTest(Func<U, T> factory)
{
_factory = factory;
}
[OneTimeSetUp]
public virtual void OneTimeSetup()
{
m_provider = (U)Substitute.For<IInterface>();
m_logic = _factory(m_provider);
}
}
在派生的測驗類中,您只需要告訴基類如何新建一個Logic<U>:
public class DerivedTest : LogicBaseTest<Logic<MyUType>, MyUType>
{
public DerivedTest()
: this(u => new Logic<MyUType>(u))
{
}
}
uj5u.com熱心網友回復:
讓我們將您的通用約束分解為簡單的英語
where T : Logic<U>, new()
這表示
的型別
T需要繼承自Logic,泛型型別引數必須是U并且有一個公共的,無引數的,建構式
但問題是,Logic它本身已經打破了這一限制。現在,我們如何解決這個問題?有多種方式
使用“工廠函式”來實體化您的
m_logic同時洗掉new約束(請參閱DiplomacyNotWar 的答案)洗掉
new()約束并使用類似的東西Activator.CreateInstance來實體化您的Logic類添加無引數建構式并以其他方式
Logic配置您的m_provider將實體化移動
m_logic到單元測驗本身(如果您需要Logic為大量單元測驗創??建相同的方法,可以添加一個輔助方法)研究你的單元測驗框架是否支持某種形式的依賴注入并注入你需要的一切
uj5u.com熱心網友回復:
您不能添加泛型型別約束,例如where T : new(U). 相反,您可以使用工廠。
public interface IFactory<out TObject, in TProvider>
{
public TObject Create(TProvider provider);
}
然后在你的基礎測驗中使用它
public class LogicBaseTest<T, U> where T : Logic <U> where U: class // remove new()
{
// fields
private readonly IFactory<T, U> _factory;
public LogicBaseTest(IFactory<T, U> factory)
{
_factory = factory;
}
[OneTimeSetUp]
public virtual void OneTimeSetup()
{
m_provider = (U)Substitute.For<IInterface>();
m_logic = _factory.Create(m_provider);
}
}
例子
public class Logic1Provider
{
}
public class Logic1Factory : IFactory<Logic1, Logic1Provider>
{
public Logic1 Create(Logic1Provider provider)
{
return new Logic1(provider);
}
}
public class Logic1 : Logic<Logic1Provider>
{
public Logic1(Logic1Provider provider) : base(provider)
{
}
public void DoDomeLogic()
{
// do stuff
}
}
var factory = new Logic1Factory();
var baseTest = new LogicBaseTest<Logic1, Logic1Provider>(factory);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/483525.html
上一篇:用字串陣列填充資料表
