如何在c#中基类的具体实现中避免强制转换?

如何在c#中基类的具体实现中避免强制转换?,c#,inheritance,design-patterns,interface,C#,Inheritance,Design Patterns,Interface,我正在编写一个概念验证数据库系统,其中我想定义数据库表和行的一些基本实现,然后从表示表和行的基类派生。例如,我在我的项目中-- 我试图避免在我的实现中对某个类型进行检查和强制转换,因此如果改为-- 但我明白,当我实现一个接口时,它不会以这种方式工作。这是正确的,还是我误解了如何使用抽象类和接口?有没有更好的方法来实现我想做的事情 本质上,我希望强制类ConcreteTableA和ConcreteTableB使用相同类型的方法“InsertRow”,但接受特定于其实现类型的参数(ConcreteR

我正在编写一个概念验证数据库系统,其中我想定义数据库表和行的一些基本实现,然后从表示表和行的基类派生。例如,我在我的项目中--

我试图避免在我的实现中对某个类型进行检查和强制转换,因此如果改为--

但我明白,当我实现一个接口时,它不会以这种方式工作。这是正确的,还是我误解了如何使用抽象类和接口?有没有更好的方法来实现我想做的事情


本质上,我希望强制类ConcreteTableA和ConcreteTableB使用相同类型的方法“InsertRow”,但接受特定于其实现类型的参数(ConcreteRowA或ConcreteRowB)。我的设计有缺陷吗?我觉得我一定违反了一些原则。

您想声明一个使用特定行类型的表的具体实例。这是一个很好的候选人。可以将接口声明修改为所需的行类型

public interface ITable<TRow> where TRow : IRow
{ 
    void InsertRow(TRow row); 
}
公共接口ITable,其中TRow:IRow
{ 
void InsertRow(TRow row);
}
然后你可以定义

public class ConcreteTableA : ITable<ConcreteRowA>
{
    void InsertRow(ConcreteRowA row); 
}

public class ConcreteRowA : IRow
{

}

public class ConcreteTableB : ITable<ConcreteRowB>
{
    void InsertRow(ConcreteRowB row); 
}

public class ConcreteRowB : IRow
{

}
公共类具体表A:ITable
{
void InsertRow(混凝土行);
}
公开课A:IRow
{
}
公共类表B:可编辑
{
空心插入行(混凝土行B行);
}
公共类混凝土RowB:IRow
{
}

您可以使表成为行类型的通用表,或者让所有行实现一个接口(
IRow
),并将
IRow
简单地注入
InsertRow
方法。
void InsertRow(BaseRow行)可以改为
void InsertRow(T行),其中T:BaseRow
您甚至可以将
T
约束添加到类(
ConcreteTableA
)而不是方法。回想起来,这是完全有意义的。谢谢你们。好的,这完全有道理。我已经阅读了关于泛型的MSDN页面,但说实话,我在理解它的应用方面有点困难。非常感谢您的回答!
public interface ITable<TRow> where TRow : IRow
{ 
    void InsertRow(TRow row); 
}
public class ConcreteTableA : ITable<ConcreteRowA>
{
    void InsertRow(ConcreteRowA row); 
}

public class ConcreteRowA : IRow
{

}

public class ConcreteTableB : ITable<ConcreteRowB>
{
    void InsertRow(ConcreteRowB row); 
}

public class ConcreteRowB : IRow
{

}