2013-01-13 133 views
2

我刚开始使用抽象类,想知道我是否以正确的方式使用它们。在我的示例中,我有一个Windows Form应用程序,其中Form1是应用程序的主UI。在Form1中,我有一个将调试消息写入richtextbox的方法。我目前有一堆不同的类,它们都有相同的方法来将消息写回到主UI richtextbox。然而,我想知道如果将这个功能作为抽象类的一部分是有意义的,那么我的所有其他类都会继承这个功能,如下所示?C#抽象类实现

using System; 
using System.Windows.Forms; 

namespace abstractTest 
{ 
    /// <summary> 
    /// Main User Interface 
    /// </summary> 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void RTBWriteLine(string message) 
     { 
      /* Print (append) message to the debug richtextbox */ 
      this.richTextBox1.AppendText(message + Environment.NewLine); 

      /* Select the last entered message */ 
      this.richTextBox1.Select(richTextBox1.Text.Length, 0); 

      /* Scroll to selected message */ 
      this.richTextBox1.ScrollToCaret(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Class1 c1 = new Class1(this); 
      Class2 c2 = new Class2(this); 
     } 
    } 

    public abstract class absTest 
    { 
     protected Form1 MainUI; 

     public virtual void MainRTBWriteLine(string msg) 
     { 
      if (MainUI != null) 
      { 
       MainUI.RTBWriteLine(msg); 
      } 
     } 
    } 

    public class Class1 : absTest 
    { 
     public Class1(Form callingForm) 
     { 
      MainUI = callingForm as Form1; 
      MainRTBWriteLine("This is Class1"); 
     } 
    } 

    public class Class2 : absTest 
    { 
     public Class2(Form callingForm) 
     { 
      MainUI = callingForm as Form1; 
      MainRTBWriteLine("This is Class2"); 
     } 
    } 
} 

编辑: 我的主要目标是,我会做出DTBWriteLine(即更新主UI其他许多方法中的一些方法),以提供给所有我的班,但只让代码在一个位置。现在,我在每一个类复制下面的方法(以及许多其他)我创建:

public virtual void MainRTBWriteLine(string msg) 
{ 
    if (MainUI != null) 
    { 
     MainUI.RTBWriteLine(msg); 
    } 
} 

如果把这个在抽象类是不是最好的方法是什么?

+0

仅供参考:'absTest'不遵循C#命名约定。您应该使用'AbsTest'。 – Candide

回答

3

是的,这个场景是使用抽象类的完美例子。

当您在继承树中共享功能时。

0

一个抽象类的点,根据该文档:

使用在类声明abstract修饰符以指示 类仅旨在是基类的其他类的

  • 抽象类不能被实例化。
  • 抽象类可能包含抽象方法和访问器。
  • 使用密封修饰符修改抽象类是不可能的,这意味着该类不能被继承。
  • 从抽象类派生的非抽象类必须包含所有继承的抽象方法和访问器的实际实现。
1

抽象类是在这种情况下的一种选择,是的。另一种方法(特别是如果你想从其他地方重复使用相同的功能)将是在单独的类中创建实用程序方法。继承是实现代码重用的一种方式,但它并不总是最好的选择 - 仔细考虑选项。

0

它是有道理的,并反映了抽象类的想法。在您的示例中,它还为您提供了一个很好的分离问题,您的absTest实现可以让您在需要时在单一点上交换记录策略。

0

抽象类广泛用于实现Template Method模式。检查C# implementation samples

我会补充说,在你的例子中是不是nessesary正好使用abstract关键字。 absTest可能不是abstract而没有任何伤害,并且在absTest(Form callingForm)构造函数实现的情况下它将完全起作用。

1

对我来说,你似乎是一个单独的DebugLogger类,其唯一的问题是将调试消息记录到文本框。

然后你的其他类只会将调试日志记录委托给这个类,而不是继承这些与他们的主要功能没有多大关系的附加功能。

+0

+1对于“与他们的主要功能没有太大关系” - 代表团方式在这里提供了更好的问题分离。 –

+0

在上面的示例中,我只显示了编写调试消息的方法,但是在我的实际应用程序中,我也有更新/递增进度条和更新statusStrip标签的方法,我希望将这些标签提供给多个类。 – E1D0L0N

+0

如果代表团的做法更合适,请您提供一个如何做到这一点的例子? – E1D0L0N