我有几个具有相同属性的类。
例如
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;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这些类共享相同的属性,我正在尝试了解接口和抽象类。
我会做 :
public abstract class BaseClass
{
public string SqlColumnName {get;set;}
public SqlDbType SqlColumnType {get;set;}
}
public class Intclass : BaseClass
{
public Intclass()
{
base.SqlColumnType = SqlDbType.Int;
}
}
Run Code Online (Sandbox Code Playgroud)
更新以更好地回答OP问题
接口指定了实现该接口的对象必须遵循的契约。而抽象基类提供了一种方法,可以在继承它的所有对象中自动实现该接口。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在该示例中,接口 IBase 表示所有实现者都必须包含这两个属性才能满足契约。这在遵循控制反转 IoC 或依赖注入模式时尤其有用。这允许您在新对象上实现接口并保持以 IBase 作为参数的任何内容的兼容性。抽象类实现接口,然后由从基类继承的任何对象继承该接口。基本上,通过使用抽象基类,您不必在子对象中专门实现每个属性。