C# 泛型和覆盖方法
C# Generic and override methods
我创建了一个 并意识到这是由于我的一些设计错误造成的。但是,我确实认为这个概念很有用,如果可能的话,我想知道如何解决类似的问题。
我想创建一个将 2 个数字相加的算法,无论是 string
还是 int
。我还希望能够在控制台中输出所有内容,并希望避免代码重复。我创建了一个根据模型变化的 generic interface
。然后是一个 class 来处理两个成员的加法。请注意,数据来自处理程序 classes(在现实生活中,它从外部数据获取信息以填充模型)。
请注意,我知道我知道有更简单的方法来添加它,但我想了解为什么它不起作用。现在,代码不由于 cannot convert from 'T' to 'Test.Models.StringModel'
,在 ValidateHandler<T>(IAddHandler<T> handler)
中编译。为什么它不能 select 正确的覆盖方法?我尝试将泛型添加到覆盖的方法中,但它仍然不起作用。我怎样才能根据它的类型使 ValidateHandler<T>
select 成为正确的方法?
这是我写的代码。
型号:
public class IntegerModel
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
public class StringModel
{
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
接口:
public interface IAddHandler<T>
{
T Add();
void GetData();
}
处理程序:
public class IntegerHandler : IAddHandler<IntegerModel>
{
public IntegerModel IntegerModel { get; set; }
public void GetData()
{
// Get Info to Add from external file for example
IntegerModel = new IntegerModel { A = 10, B = 20 };
}
public IntegerModel Add()
{
IntegerModel.C = IntegerModel.A + IntegerModel.B;
return IntegerModel;
}
}
public class StringHandler : IAddHandler<StringModel>
{
public StringModel StringModel { get; set; }
public void GetData()
{
// Get Info to Add from external file for example
StringModel = new StringModel { A = "10", B = "20" };
}
public StringModel Add()
{
StringModel.C = StringModel.A + StringModel.B;
return StringModel;
}
}
这是 Main 及其功能
public static void Main(string[] args)
{
var integerHandler = new IntegerHandler();
var stringHandler = new StringHandler();
ValidateHandler(integerHandler);
ValidateHandler(stringHandler);
}
public static void ValidateHandler<T>(IAddHandler<T> handler)
{
handler.GetData();
var result = handler.Add();
WriteResults(result);
}
public static void WriteResults(StringModel model)
{
Console.WriteLine(model.C);
}
public static void WriteResults(IntegerModel model)
{
Console.WriteLine(model.C);
}
我知道我可以执行以下操作,但这样做似乎效果不佳,那时我不明白使用泛型的意义。
public static void ValidateHandler<T>(IAddHandler<T> handler)
{
handler.GetData();
var result = handler.Add();
if (typeof(T) == typeof(StringModel))
{
WriteResults(result as StringModel);
}
else if (typeof(T) == typeof(IntegerModel))
{
WriteResults(result as IntegerModel);
}
}
我会编写一个使用 object
而不是类型参数的非通用 IModel 接口,并在您的通用 class 中显式实现它。
我创建了一个
我想创建一个将 2 个数字相加的算法,无论是 string
还是 int
。我还希望能够在控制台中输出所有内容,并希望避免代码重复。我创建了一个根据模型变化的 generic interface
。然后是一个 class 来处理两个成员的加法。请注意,数据来自处理程序 classes(在现实生活中,它从外部数据获取信息以填充模型)。
请注意,我知道我知道有更简单的方法来添加它,但我想了解为什么它不起作用。现在,代码不由于 cannot convert from 'T' to 'Test.Models.StringModel'
,在 ValidateHandler<T>(IAddHandler<T> handler)
中编译。为什么它不能 select 正确的覆盖方法?我尝试将泛型添加到覆盖的方法中,但它仍然不起作用。我怎样才能根据它的类型使 ValidateHandler<T>
select 成为正确的方法?
这是我写的代码。
型号:
public class IntegerModel
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
public class StringModel
{
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
接口:
public interface IAddHandler<T>
{
T Add();
void GetData();
}
处理程序:
public class IntegerHandler : IAddHandler<IntegerModel>
{
public IntegerModel IntegerModel { get; set; }
public void GetData()
{
// Get Info to Add from external file for example
IntegerModel = new IntegerModel { A = 10, B = 20 };
}
public IntegerModel Add()
{
IntegerModel.C = IntegerModel.A + IntegerModel.B;
return IntegerModel;
}
}
public class StringHandler : IAddHandler<StringModel>
{
public StringModel StringModel { get; set; }
public void GetData()
{
// Get Info to Add from external file for example
StringModel = new StringModel { A = "10", B = "20" };
}
public StringModel Add()
{
StringModel.C = StringModel.A + StringModel.B;
return StringModel;
}
}
这是 Main 及其功能
public static void Main(string[] args)
{
var integerHandler = new IntegerHandler();
var stringHandler = new StringHandler();
ValidateHandler(integerHandler);
ValidateHandler(stringHandler);
}
public static void ValidateHandler<T>(IAddHandler<T> handler)
{
handler.GetData();
var result = handler.Add();
WriteResults(result);
}
public static void WriteResults(StringModel model)
{
Console.WriteLine(model.C);
}
public static void WriteResults(IntegerModel model)
{
Console.WriteLine(model.C);
}
我知道我可以执行以下操作,但这样做似乎效果不佳,那时我不明白使用泛型的意义。
public static void ValidateHandler<T>(IAddHandler<T> handler)
{
handler.GetData();
var result = handler.Add();
if (typeof(T) == typeof(StringModel))
{
WriteResults(result as StringModel);
}
else if (typeof(T) == typeof(IntegerModel))
{
WriteResults(result as IntegerModel);
}
}
我会编写一个使用 object
而不是类型参数的非通用 IModel 接口,并在您的通用 class 中显式实现它。