我想为指定的类创建泛型方法。伪代码可能如下所示:
void doSend(Guid g)
{
//code
}
void doSend(Int32 i)
{
//code
}
void Send<T>(T param) where T:Guid or Int32
{
//lots of code
doSend(param)
//lots of code
}
我不想复制和粘贴整个实现只更改一行。
答案 0 :(得分:2)
你没有理由这样做吗?
void Send(Guid param)
{
ChunkA();
doSend(param);
ChunkB();
}
void Send(Int32 param)
{
ChunkA();
doSend(param);
ChunkB();
}
void ChunkA()
{
//lots of code
}
void ChunkB()
{
//lots of code
}
另外,如果您只期望这两种类型......使用泛型会略微滥用它。您可能想退一步并重新考虑您的设计。
修改强>
由于您在评论中提到共同的代码是日志记录和错误处理,我认为对Send
和Guid
进行Int32
的重载更有意义。您可以使用Send
方法看起来更像这样:
void Send(Guid param)
{
try
{
LogSend(param);
doSend(param);
}
catch (SendException e)
{
HandleSendException(e, param);
}
}
答案 1 :(得分:0)
我不想复制和粘贴整个实现只更改一行。
然后不要。将所有通用代码移动到一个或多个方法中,从入口点调用这些方法,并只保留特定于Guid
或int
的实现 在调用方法中:
void doSend(Guid g)
{
//do stuff specific to `Guid`
doSendCommon(g);
}
void doSend(Int32 i)
{
//do stuff specific to `int`
doSendCommon(i);
}
private void doSendCommon<T>(T value)
{
// do stuff common to both
}
请注意,doSendCommon
可以完全通用,但由于它是private
,您控制可以传入的类型。
答案 2 :(得分:0)
如何使用界面:
public interface IDoIt
{
void DoIt();
}
public class Foo : IDoIt
{
public void DoSomething()
{
}
public void DoIt()
{
this.DoSomething();
}
}
public class Bar : IDoIt
{
public void DoSomethingElse()
{
}
public void DoIt()
{
this.DoSomethingElse();
}
}
public class GenericClass<T> where T: IDoIt, new ()
{
public GenericClass()
{
T obj = new T();
obj.DoIt();
}
}