【问题标题】:Proper use of an abstract class正确使用抽象类
【发布时间】:2011-07-13 20:27:23
【问题描述】:

我正在使用 .Net 并且有一个简单的主类和子类设计。我的主类包含几乎所有的功能,子类只需要从主类中设置一个值。我正在考虑将 master 设为一个抽象类,但没有必须重写的方法,但我想强调 master 类不一定独立存在的想法。另外,我想强调的是,主类的属性必须由子类设置。这里有什么合适的? 感谢您的帮助!

【问题讨论】:

  • 您能否添加一个链接来解释设计模式?
  • 我认为您的设计选择有误。我的理解是,如果您要更改功能或行为,而不是单个值,则应该只从其他类型继承。您最好使用工厂(或其他适当的设计模式)来创建对象。

标签: c# inheritance abstract ooad


【解决方案1】:

如果没有人应该创建主类的实例,那么将其设为 abstract 绝对合适。

对于属性,将其设为抽象属性。在 master 中,写如下内容:

public abstract int MyProperty { get; } 

然后子类必须覆盖它。

【讨论】:

  • 谢谢。如果子类不覆盖任何功能,情况是否如此?我相信我可以复习我的大师班并考虑开一家工厂。
  • 如果没有功能被覆盖,我不会使用继承。我同意上面 Jeff M 的评论。
【解决方案2】:

如果主类确实不能有具体实例,那么将其抽象化是绝对正确的。

【讨论】:

    【解决方案3】:

    抽象类是合适的。你可以让它有一个受保护的构造函数来获取你关心的属性,这样子类就必须提供它

    【讨论】:

      【解决方案4】:

      我的大师班几乎包含所有 功能和子类 只需要从 主人。

      这听起来更像是你应该在你的主类中公开一个静态工厂方法,它接受这个值并返回一个主类的实例。将主类的构造函数设为私有,这样只有您的静态工厂方法才能创建主类的实例。

      类似这样的:

      public class MasterClass
      {
          public string MyValue { get; set; }
          private MasterClass()
          {
          }
      
          public static MasterClass CreateMaster(string val)
          {
              MasterClass mc = new MasterClass() { MyValue = val };
              return mc;
          }
      }
      

      【讨论】:

      • 我有点“防静电”,所以我最初的设计是尽量避免使用静态方法。
      • 这难道不比在复杂性方面添加多个其他类更好吗?
      【解决方案5】:

      将主类抽象化应该没问题 - 毕竟你永远不希望它在没有被继承的情况下被使用。

      您还可以将属性声明为抽象的,这样它就必须在子类中被覆盖:

      public abstract string MyProperty { get; set; }
      

      【讨论】:

      • 我从未使用过这种技术,感谢您分享它。我将调查这是否适合我的应用程序。
      【解决方案6】:

      如果除了设置一些已经在“主”中的特定状态之外没有什么可扩展的,那么听起来你根本不需要继承,也许需要控制你的“主”类的实例被构造出来。

      您可以改为使用工厂模式。

      但是,如果您要改变行为,那么绝对有必要使用 abstract

      【讨论】:

      • 我没有改变行为,只是设置属性,所以我相信我会研究一个 Tactory。
      • 澄清一下,根据@BrokenGlass 的回答,使用工厂模式将使您能够控制构建类的机制/条件。这是针对不需要继承的情况-您上面的评论似乎证实了这一点。
      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2013-10-12
      • 1970-01-01
      相关资源
      最近更新 更多