实现相同属性的 C# 类

FPG*_*PGA 2 c# oop

我有几个具有相同属性的类。

例如

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)

正如您所看到的,这些类共享相同的属性,我正在尝试了解接口和抽象类。

  • 您将如何通过创建一个包含它们共享的内容的接口来组织这些类?
  • 界面是最好的方式吗?
  • 我可以将这些类添加到接口类型列表中,以便无需强制转换即可访问属性吗?
  • 为什么是接口,为什么是抽象类,它们相对于彼此有什么优势

Wjd*_*is5 5

我会做 :

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 作为参数的任何内容的兼容性。抽象类实现接口,然后由从基类继承的任何对象继承该接口。基本上,通过使用抽象基类,您不必在子对象中专门实现每个属性。

  • 我认为“SqlColumnType”的“受保护集”也可能是有必要的。毕竟,我不希望这种情况在运行时发生改变。 (3认同)