我有两个派生类(Sale和ServiceCharge).两者都是交易.如果我有BusinessService,我想为它创建一个ServiceCharge.如果我传递产品,我想实例化Sale.
这是我的想法.
private void CreateInstance(object element)
{
Transaction transaction;
if (element.GetType() == typeof(BussinessService))
{
transaction = new ServiceCharge((BussinessService)element))
}
else
{
transaction = new Sale((Product)element);
}
{
Run Code Online (Sandbox Code Playgroud)
你能告诉我一个更优雅的方式吗?我会知道如何只用一个构造函数来使用泛型
private void CreateInstance<T>(T element)
{
Transaction transaction = new Transaction((T)element);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何处理第一个案例.
定义这样的通用接口:
public interface ITransactionable<T>
where T : Transaction
{
T CreateTransaction();
}
Run Code Online (Sandbox Code Playgroud)
装饰你的BussinessService和Product:
public class BussinessService :
ITransactionable<ServiceCharge>
{
public T CreateTransaction()
{
return new ServiceCharge(this);
}
}
public class Product :
ITransactionable<Sale>
{
public T CreateTransaction()
{
return new Sale(this);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您的泛型方法可以定义为:
private void CreateInstance<T>(ITransactionable<T> element)
{
Transaction transaction = element.CreateTransaction();
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只是一个简单的界面也可以工作:
interface ITransactionable
{
Transaction CreateTransaction();
}
class BusinessService : ITransactionable
{
public Transaction CreateTransaction() { return new ServiceCharge( this ); }
}
class Product : ITransactionable
{
public Transaction CreateTransaction() { return new Sale( this ); }
}
Run Code Online (Sandbox Code Playgroud)
private void CreateInstance(ITransactionable element)
{
Transaction transaction = element.CreateTransaction();
...
}
Run Code Online (Sandbox Code Playgroud)