我有几个具有相同属性的类。
例如
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;
}
//...
}
正如您所看到的那些类共享相同的属性,我正在尝试学习接口和抽象类。
答案 0 :(得分:3)
我会将SqlColumnType
abstract和read-only强制在派生类中实现它。
public abstract class BaseClass
{
public string SqlColumnName { get; set; }
public abstract SqlDbType SqlColumnType { get; }
}
public class Intclass : BaseClass
{
public override SqlDbType SqlColumnType
{
get { return SqlDbType.Int; }
}
}
答案 1 :(得分:0)
我愿意:
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 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;
}
}
因此在该示例中,接口IBase表示所有实现者必须包含这两个属性才能满足合同。这在遵循控制反转控制IoC或依赖注入模式时尤其有用。这允许您在新对象上实现接口,并保持以IBase作为参数的任何内容的兼容性。 抽象类实现接口,然后由继承自基类的任何对象继承该接口。基本上,通过使用抽象基类,您不必专门实现子对象中的每个属性。