【问题标题】:Correct Way To Move Common Properties移动公共属性的正确方法
【发布时间】:2017-01-27 17:57:15
【问题描述】:

我有一组大约 20 个属性,我需要在两个不同的实体(类)中用于分层覆盖设置系统。

所以,我能想到的简单想法是,用这 20 个通用属性创建一个抽象类,并在两个实体中继承抽象类。

但这行不通,因为我还有一些更常见的属性,这些属性对所有实体都是通用的。所以我已经继承了所有实体。而这 20 个属性并不是所有实体都通用的(只有两个 - 三个)。因此我无法在现有抽象类中添加这 20 个属性。

我尝试创建一个接口并实现它,但后来我忘记了我需要在具体类中实现它。因此,如果我必须在具体的类中定义它们,那无助于解决我的问题。

有什么想法吗?这样做的正确方法是什么?在不久的将来,我可能会在少数实体中拥有一些更常见的属性。那么我应该怎么做,在不重新访问和重写每个实体中的公共属性的情况下保持公共属性之间的一致性?

【问题讨论】:

  • 复合而不是继承怎么样?
  • @CrudaLilium Well 复合材料不起作用,因为我这样做是为了定义 EF 类。

标签: c# oop object-oriented-analysis


【解决方案1】:

让您的“通用设置”类继承自“通用实体”类。然后从通用设置类派生设置类。

class common_entity {}

class common_settings : common_entity {}

class settings : common_settings {}

class entity : common_entity {}

【讨论】:

  • 好吧,那样我必须为每个常见的圈子创建很多类。这是正确的方法吗?
  • 我不明白你的句子,但你的问题的答案是肯定的,这是正确的方法。
【解决方案2】:

也许我弄错了,但有时我们往往想要太多的可重用性。

查看此示例代码

public class Person
{
    public string Name { get; set; }
}

public class Company
{
    public string Name { get; set; }
}

因为我们认为两个类共享一个Name 属性,我们应该创建一个基类:

public class Entity
{
    public string Name { get; set; }
}

public class Person : Entity
{
}

public class Company : Entity
{
}

我会明确定义一个基实体类,因为任何实体都应该拥有一个唯一标识符,但不是Name。如果实体的子集应该拥有Name,我将定义一个interface,它将由具体实体实现或不实现。稍后我会询问对象是否实现给定接口(即obj is IWhatevervar whatever = obj as IWhatever)。

顺便说一句,正如您在自己的解决方案中已经指出的那样,虽然某些操作可能会增加代码的可重用性,但这些操作可能会对您的设计产生负面影响。

看看你说了什么:

我有一组大约 20 个属性,我需要两个属性 不同的实体

所以您有两个类应该实现 20 个属性,而您只是因为可以定义 interface 而需要在这两个类中实现它而摸不着头脑?

采用interface 方法! Visual Studio没有接口实现代码生成吗?

认为对 OOP 的一个常见批评是您最终会生成更多代码,而 OOP 的关键在于如果您保留代码,更多代码并不意味着更少的可维护性简单且易于理解。这不是减少编码,而是正确编码

【讨论】:

  • 非常感谢,现在对我来说更有意义了。我正在寻找通用编码(单点编码)方法,因为稍后我可能会在这 20 个通用属性中添加更多属性。只是我不想忘记将它们添加到一个类中,然后将它们添加到另一个类中。因此,保持一个共同点来定义这些共同属性将使我免于以后的麻烦。
猜你喜欢
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多