我想要Adapter
之类的功能。父类需要DataTable
,而其派生类可以传入任何内容。我现在将数据类型设置为object
然后投射它。但我不认为这很漂亮。
class Parent
{
protected void Add(DataTable dt) { ... } // the real business logics
public virtual void AddRaw(object anything) {}
}
class Child1 : Parent
{
public override void AddRaw(object anything)
{
MyTable1 t = (MyTable1) anything;
// pseudo code
DataTable dt = new DataTable();
foreach(row r in t)
{
dt.AddRow(r);
}
this.Add(dt);
}
}
class Child2 : Parent
{
public override void AddRaw(object anything)
{
MyTable2 t = (MyTable2) anything;
...
}
}
我有来自javascript
和python
的背景信息。用“弱类型”语言做这些事情是很常见的,你可以在任何地方传递任何东西。
我之前在<T>
使用了delegate
和C#
。但我想不出在这里使用它们的方法。
C#
这样做的方式是什么?
答案 0 :(得分:3)
您可以使用dynamic
关键字,接口实现或抽象基类,但我个人更喜欢使用尽可能多的类型成员。
使用dynamic
:
public override void AddRaw(dynamic anything)
{
// pseudo code
DataTable dt = new DataTable();
foreach(row r in anything)
{
dt.AddRow(r);
}
this.Add(dt);
}
如果您想匹配任何内容并根据类型采取行动,您也可以执行此类操作:
public override void AddRaw(object anything)
{
if (o is MyTable)
{ ... }
else if (o is string)
{ ... }
}
答案 1 :(得分:0)
如何重载方法?
class Parent
{
protected void Add(DataTable dt) { ... }
}
class Child1:Parent
{
public void Add(MyTable1 anything)
{
// pseudo code
DataTable dt = new DataTable();
foreach(row r in anything)
{
dt.AddRow(r);
}
this.Add(dt);
}
}
class Child2:Parent
{
public void Add(MyTable2 anything)
{
...
}
}
答案 2 :(得分:0)
您可以将父类设为通用:
class Parent<T>
{
protected void Add(DataTable dt) { ... } // the real business logics
public virtual void AddRaw(T anything) {}
}
class Child1 : Parent<MyTable1>
{
public override void AddRaw(MyTable1 anything) { ... }
}
class Child2 : Parent<MyTable2>
{
public override void AddRaw(MyTable2 anything) { ... }
}
此外,我建议将Parent
抽象化,除非您确实需要创建Parent
个实例:
abstract class Parent<T>
{
protected void Add(DataTable dt) { ... } // the real business logics
public abstract void AddRaw(T anything);
}
这样,编译器确保每个客户端必须实现AddRaw
。
答案 3 :(得分:0)
我想我会使用适配器解析器类。在自己的类中创建每个适配器,并使用静态类及其适配器类型
注册它们Adapters.Register(typeof(MyTable), MyTableAdapter)
或 // void Register(Adapter)和MyTableAdapter:Adapter Adapters.Register(MyTableAdapter)
然后你要从适配器列表
请求一个适配器Adapters.GetAdapter<MyTable>();
如果没有注册该类型的适配器,则可以返回合理的错误