Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以继承形式自动实现属性_C#_Inheritance_Properties_Declare - Fatal编程技术网

C# 以继承形式自动实现属性

C# 以继承形式自动实现属性,c#,inheritance,properties,declare,C#,Inheritance,Properties,Declare,我正在创建一个表单来管理我的应用程序的报告,其思想是每个报告表单都继承自这个基本表单。我的问题是它包含几个必须分配的属性,如果我已经调用了all,我需要在每个子窗体上进行验证,所以。。。我想知道是否有一种方法可以自动调用所有这些属性 这是控制器代码的一部分: public abstract partial class ReportsController() { public string Table{ get; set; } public string Fields{ get;

我正在创建一个表单来管理我的应用程序的报告,其思想是每个报告表单都继承自这个基本表单。我的问题是它包含几个必须分配的属性,如果我已经调用了all,我需要在每个子窗体上进行验证,所以。。。我想知道是否有一种方法可以自动调用所有这些属性

这是控制器代码的一部分:

public abstract partial class ReportsController()
{
    public string Table{ get; set; }
    public string Fields{ get; set; }
    public string Condition{ get; set; }
    public string Group{ get; set; }
    public string Order{ get; set; }
    public DataGridViewColumnCollection Columns{ get; set; }
    public SortedList<string, string> ComboboxFields{ get; set; }
    etc...

    protected abstract void New();
    protected abstract void Edit();
    protected abstract void Print();
}
我在找这个:

public partial class frmReportGuards : ReportsController
{
     public frmReportGuards()
     {
         //Auto assigned properties.
         Table = "";
         Fields = "";
         Condition = "";
         Group = "";
         Order = "";
         Columns = new DataGridViewColumnCollection();
         ComboboxFields = new SortedList<string, string>();
     }
     protected override void New()
     {
         code...
     }
     other methods...
}
公共部分类frmReportGuards:ReportsController
{
公共frmReportGuards()
{
//自动分配的属性。
表=”;
字段=”;
条件=”;
组=”;
订单=”;
Columns=新的DataGridViewColumnCollection();
ComboboxFields=new SortedList();
}
受保护的覆盖无效新()
{
代码。。。
}
其他方法。。。
}

我不知道我是否在这里失去理智,我真的需要摆脱这种怀疑,如果可能的话。。。然后简化我的工作。

您可以为抽象基和子类都需要实现的属性实现一个接口。

您可以为抽象基和子类都需要实现的属性实现一个接口。

如果您的目标是确保将属性初始化为一些默认值,只需在
ReportsController
中添加一个构造函数并在那里设置属性。

如果您的目标是确保属性初始化为一些默认值,只需在
ReportsController
中添加一个构造函数并在那里设置属性。

简短的答案不是在C#5.0中,而是在C#6.0中,但我认为这不是你想要的

假设您需要一个无参数构造函数,您可以创建一个从基构造函数调用的Init抽象方法,并检查初始化是否缺少属性。在那里,您可以抛出异常或显示指示失败的可视消息

因此,在base中,您可以:

public abstract partial class ReportsController()
{
    public ReportsController()
    {
        InitializeComponent();
        //now your method
        Init();
        CheckProperties();            
    }

    protected virtual void CheckProperties()
    {
       if(Table==null)
          addVisualErrorMessage("Table property missing");
       //and so on
    }

    protected abstract void Init();
}
但是,也许您必须重新考虑您的设计,并提供一个包含所有属性的单一类,这样您就可以创建一个抽象方法,强制您提供所有这些重要属性,而不是覆盖单个方法:

public class ComplexProperties
{
  public string Table{ get; set; }
  public string Fields{ get; set; }
  public string Condition{ get; set; }
  public string Group{ get; set; }
  public string Order{ get; set; }
  public DataGridViewColumnCollection Columns{ get; set; }
  public SortedList<string, string> ComboboxFields{ get; set; }
}

public abstract partial class ReportsController()
{
    public ComplexProperties Properties {get; private set;}

    public ReportsController()
    {
        InitializeComponent();
        //now your method
        Properties= Init();
        CheckProperties(); 
    }

    protected abstract ComplexProperties Init();
}
然后从构造函数初始化:

 public partial class MyReport:ReportsController
 {
    public MyReport():base(new ComplexProperties { Table="",...})
    {
    }
 }
简短的回答不是用C#5.0,而是用C#6.0,但我认为这不是你想要的

假设您需要一个无参数构造函数,您可以创建一个从基构造函数调用的Init抽象方法,并检查初始化是否缺少属性。在那里,您可以抛出异常或显示指示失败的可视消息

因此,在base中,您可以:

public abstract partial class ReportsController()
{
    public ReportsController()
    {
        InitializeComponent();
        //now your method
        Init();
        CheckProperties();            
    }

    protected virtual void CheckProperties()
    {
       if(Table==null)
          addVisualErrorMessage("Table property missing");
       //and so on
    }

    protected abstract void Init();
}
但是,也许您必须重新考虑您的设计,并提供一个包含所有属性的单一类,这样您就可以创建一个抽象方法,强制您提供所有这些重要属性,而不是覆盖单个方法:

public class ComplexProperties
{
  public string Table{ get; set; }
  public string Fields{ get; set; }
  public string Condition{ get; set; }
  public string Group{ get; set; }
  public string Order{ get; set; }
  public DataGridViewColumnCollection Columns{ get; set; }
  public SortedList<string, string> ComboboxFields{ get; set; }
}

public abstract partial class ReportsController()
{
    public ComplexProperties Properties {get; private set;}

    public ReportsController()
    {
        InitializeComponent();
        //now your method
        Properties= Init();
        CheckProperties(); 
    }

    protected abstract ComplexProperties Init();
}
然后从构造函数初始化:

 public partial class MyReport:ReportsController
 {
    public MyReport():base(new ComplexProperties { Table="",...})
    {
    }
 }

现在我明白了,如果您需要强制实现,您应该使用抽象属性来实现,继承类应该实现,并且可以使用自动属性来实现:

public abstract class A
{
    public abstract int MyProperty { get; set; }
}

public class B : A
{
    public override int MyProperty { get; set; }
}

现在我明白了,如果您需要强制实现,您应该使用抽象属性来实现,继承类应该实现,并且可以使用自动属性来实现:

public abstract class A
{
    public abstract int MyProperty { get; set; }
}

public class B : A
{
    public override int MyProperty { get; set; }
}


为什么不向ReportsController添加一个构造函数并在那里设置属性?不是初始化属性,我想我解释错了,是强制子类实现它们。为什么不向ReportsController添加一个构造函数并在那里设置属性?不是初始化属性,我想我解释错了,是关于强迫孩子们去实现它们。我想这正是我应该做的。。。一直以来,我都在考虑如何通过继承实现属性,但接口实际上可以解决这个问题。。。谢谢,我会试试看,如果有效的话,我会把它标记为答案:)我想这正是我应该做的。。。一直以来,我都在考虑如何通过继承实现属性,但接口实际上可以解决这个问题。。。谢谢,我会尝试一下,如果它有效,将标记为答案:)不,是关于实现子类中的每个属性,就像@ForeverZer0说的,我可能需要一个接口,但我之前没有考虑过…。@a.daw好的,所以只需将属性声明为抽象。不需要创建接口。@a.daw在单独的接口中定义属性只会引入不必要的复杂性。除非接口提供了
ReportsController
类的有用抽象,否则请坚持使用抽象属性。我这样做了,但我标记为接受了第一个答案,该答案说明了这一点,我非常感谢您的帮助:)不,是关于实现子类中的每个属性,如@ForeverZer0所说,我可能需要一个接口,但我之前没有考虑过…。。@a.daw好的,所以只需将属性声明为抽象。不需要创建接口。@a.daw在单独的接口中定义属性只会引入不必要的复杂性。除非接口提供了
ReportsController
类的有用抽象,否则请坚持使用抽象属性。我这样做了,但我标记为接受了第一个说明这一点的答案,我非常感谢您的帮助:)我感谢您花了这么多时间来回答,但我认为我没有很好地解释它。。。我需要强制子类实现属性,而不是初始化它们,我的目标是确保每个子类都实现了,这样我就不会错过分配一个。因此,如果需要强制实现属性,也可以执行抽象属性,我为这个解决方案添加了另一个答案。我感谢您花时间回答,但我认为我没有很好地解释它。。。我