가 인터페이스를 가지고 할 수있는 방법이 있나요 구체적인 클래스를 만들려면 다음일반 클래스는 말한다, 자동으로
/// <summary>
/// Interface containing operators which operate on T
/// </summary>
public interface IScalarOperators<T>
{
// Adds two T objects
IOperateScalar<T> OperatorAdd { get; }
// Subtracts two T objects
IOperateScalar<T> OperatorSubtract { get; }
// Multiplies two T objects
IOperateScalar<T> OperatorMultiply { get; }
}
// Class containing all the Scalar operators for a given T
class ScalarOperators<T> : IScalarOperators<T>
{
public IOperateScalar<T> OperatorAdd { get; private set; }
public IOperateScalar<T> OperatorSubtract { get; private set; }
public IOperateScalar<T> OperatorMultiply { get; private set; }
private ScalarOperators(IOperateScalar<T> add, IOperateScalar<T> subtract, IOperateScalar<T> multiply)
{
this.OperatorAdd = add;
this.OperatorSubtract = subtract;
this.OperatorMultiply = multiply;
}
public static ScalarOperators<bool> CreateBool()
{
return new ScalarOperators<bool>(new AddBool(), new SubtractBool(), new MultiplyBool());
}
public static ScalarOperators<int> CreateInt()
{
return new ScalarOperators<int>(new AddInt(), new SubtractInt(), new MultiplyInt());
}
// METHOD I WANT TO ADD
public static ScalarOperators<T> Create()
{
// if T == bool
// return CreateBool()
// if T == int
// return CreateInt()
// else (no definition available for T)
// return null
}
// I tried something like below, but it didn't work...
public static ScalarOperators<T> Create<T>() where T: bool
{ return CreateBool(); }
public static ScalarOperators<T> Create<T>() where T : int
{ return CreateInt(); }
public static ScalarOperators<T> Create<T>()
{ return null; }
}
공지 사항, 나는 사업자의 정확한 세트를 작성하는 일반적인 작성 방법을하고 싶습니다,하지만 난 그것을하는 방법을 모르겠다.
나는이 방법에서 매개 변수를 제거하는 데 사용하고 싶습니다 :
public static IMatrix<T> Add<T>(this IMatrix<T> matrix, IMatrix<T> other, IScalarOperators<T> operators)
{
JoinCells<T> joiner = new JoinCells<T>();
return joiner.Join(matrix, other, null, operators.OperatorAdd);
}
은 어떤 도움
public static IMatrix<T> Add<T>(this IMatrix<T> matrix, IMatrix<T> other)
{
JoinCells<T> joiner = new JoinCells<T>();
return joiner.Join(matrix, other, null, ScalarOperators<T>.Create().OperatorAdd);
}
감사가된다! 주로 scalarOperator 객체를 확장 메서드에 전달하지 않으려는 경우 정의 된 T에 대해 ScalarOperators가 변경되지 않으므로 '기본'값을 갖는 것을 선호합니다. 당신 정말 만약 내가 대신 정적 클래스의 IScalarOperators의 공장을 (만드는 것이 좋습니다
public static ScalarOperators<T> Create()
{
Type type = typeof(T);
if(type == typeof(bool))
return CreateBool()
if(type == typeof(int))
return CreateInt()
else
return null
}
일반 계산을 허용하도록 라이브러리를 만드는 것처럼 보입니까? [이 라이브러리] (http : //www.codeproject.com/KB/cs/genericnumerics.aspx). 최근에는 표현식 트리가 다른 멋진 솔루션을 제공합니다. [Marc Gravell 's MiscUtils] (http://www.yoda.arachsys.com/csharp/miscutil/usage/genericoperators.html) 구현을 확인하십시오. –