我有几个具有相同属性的类。
例如
public class Decimalclass
{
public string SqlColumnName {get;set;}
public SqlDbType SqlColumnType {get;set;}
public Decimalclass()
{
SqlColumnType = SqlDbType.Decimal;
}
//...
}
public class Textclass
{
public string SqlColumnName {get;set;}
public SqlDbType SqlColumnType {get;set;}
public Textclass()
{
SqlColumnType = SqlDbType.NVarChar;
}
//...
}
public class Intclass
{
public string SqlColumnName {get;set;}
public SqlDbType SqlColumnType {get;set;}
public Intclass()
{
SqlColumnType = SqlDbType.Int;
}
//...
}
如您所见,这些类共享相同的属性,我正在尝试了解接口(interface)和抽象类。
- 您将如何通过创建一个接口(interface)来组织这些类 持有他们共享的东西?
- 界面是最好的方式吗?
- 我可以将这些类添加到接口(interface)类型的列表中吗 以便我无需强制转换即可访问属性?
- 为什么是接口(interface),为什么是抽象类,它们有什么优势 互相争吵
最佳答案
我会这样做:
public abstract class BaseClass
{
public string SqlColumnName {get;set;}
public SqlDbType SqlColumnType {get;set;}
}
public class Intclass : BaseClass
{
public Intclass()
{
base.SqlColumnType = SqlDbType.Int;
}
}
已更新以更好地回答 OP Q
接口(interface)指定了实现接口(interface)的对象必须遵循的契约。而抽象基类提供了一种方法,可以在所有继承自它的对象中自动实现接口(interface)。
interface IBase
{
string SqlColumnName { get; set; }
SqlDbType SqlColumnType { get; set; }
}
public abstract class BaseClass : IBase
{
public string SqlColumnName { get; set; }
public SqlDbType SqlColumnType { get; set; }
}
public class Intclass : BaseClass
{
public Intclass()
{
base.SqlColumnType = SqlDbType.Int;
}
}
所以在那个例子中,接口(interface) IBase 说所有的实现者都必须包含这两个属性来满足契约。这在遵循控制反转 IoC 或依赖注入(inject)模式时尤其有用。这允许您在新对象上实现接口(interface)并保持任何以 IBase 作为参数的兼容性。 抽象类实现接口(interface),然后由从基类继承的任何对象继承。基本上,通过使用抽象基类,您不必专门实现子对象中的每个属性。
关于实现相同属性的 C# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111578/