C# 适当的类结构#
我需要一些关于为6种不同但相似类型的应用程序构建类的建议。这6种类型都有一些共享的属性和方法。还有一些属性和方法,其中3个、4个或5个将共享,但对其他人没有意义 目前,我有一个抽象基类,具有:C# 适当的类结构#,c#,oop,inheritance,C#,Oop,Inheritance,我需要一些关于为6种不同但相似类型的应用程序构建类的建议。这6种类型都有一些共享的属性和方法。还有一些属性和方法,其中3个、4个或5个将共享,但对其他人没有意义 目前,我有一个抽象基类,具有: 所有子类将使用的属性和方法已经实现 一些子类将使用的方法标记为抽象,在子类中实现 某些子类将使用的属性被标记为可空,以便不使用该属性的子类可以为空 不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述 编辑--添加代码示例 public a
- 所有子类将使用的属性和方法已经实现
- 一些子类将使用的方法标记为抽象,在子类中实现
- 某些子类将使用的属性被标记为可空,以便不使用该属性的子类可以为空
public abstract class BaseClass
{
//all classes inheriting from BaseClass would use these properties
public string Property1{ get; set; }
public string Property2{ get; set; }
public void Method1() {
//all classes inheriting from BaseClass would use this method
}
//more than one class (but not all classes)
// inheriting from BaseClass would use these properties
public int? Property3 { get; set; }
public bool? Propert4 { get; set; }
public abstract void Method2() {
//more than one class (but not all classes)
// inheriting from BaseClass would use this method
//those not using this method would have empty getters and setters maybe?
}
}
不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述
虽然没有什么细节,但听起来您最好在类层次结构中有一个单独的“层”
类3、4和5可以派生自单独的抽象类,而抽象类又继承了您的“基类”。这将消除类1和类2中包含“未使用的”方法和属性的需要
基本上,“某些子类将使用的属性标记为可空,以便不使用该属性的子类可以为空”不在基类中,而是添加到子类中,而子类又是3、4和5的子类
不过,这似乎不是最好的解决方案。我觉得我已经提供了足够的细节,但如果这没有意义,请让我知道,我会尝试提供更好的描述
虽然没有什么细节,但听起来您最好在类层次结构中有一个单独的“层”
类3、4和5可以派生自单独的抽象类,而抽象类又继承了您的“基类”。这将消除类1和类2中包含“未使用的”方法和属性的需要
基本上,“某些子类将使用的属性标记为可空,以便不使用该属性的子类可以为空”不在基类中,而是添加到子类中,而子类又是3、4和5的子类。您应该详细说明层次结构以避免使用可空。您应该创建
您应该详细说明层次结构,以避免使用nullables。您应该创建
你知道你可以这样继承吗
****************************
* *
* FooBase *
* *
****************************
. .
. .
. .
************** *****************
* * * *
* FooA * * FooB *
* * * *
* * * *
************** *****************
. . .
. . .
. . .
. . .
************** ************** **************
* * * * * *
* * * * * *
* FooA_a * * FooA_b * * FooB_a *
* * * * * *
* * * * * *
* * * * * *
************** ************** **************
那么,既然可以在FooA而不是FooBase中实现可空属性,为什么还要添加这些属性呢
编辑所以,因为我在画东西,所以打败了我:你知道你可以像这样继承吗
****************************
* *
* FooBase *
* *
****************************
. .
. .
. .
************** *****************
* * * *
* FooA * * FooB *
* * * *
* * * *
************** *****************
. . .
. . .
. . .
. . .
************** ************** **************
* * * * * *
* * * * * *
* FooA_a * * FooA_b * * FooB_a *
* * * * * *
* * * * * *
* * * * * *
************** ************** **************
那么,既然可以在FooA而不是FooBase中实现可空属性,为什么还要添加这些属性呢
编辑所以,我就这么做了,因为我在画东西:为什么要使用子类化?让抽象基类只拥有所有类型共享的方法。将其他方法拉入单独的类中,让需要该功能的类与提取的类协作。这将创建更好的内聚性和更松散的耦合。为什么要使用子类化?让抽象基类只拥有所有类型共享的方法。将其他方法拉入单独的类中,让需要该功能的类与提取的类协作。这将创建更好的内聚性和更松散的耦合。您可以发布一些代码吗?您可以从基类继承多个抽象类。我添加了一些示例代码,这只是一个概念示例。我想不出一个好的并行示例,也无法共享我的实际代码。很抱歉。你能发布一些代码吗?你可以从一个基类继承多个抽象类。我添加了一些示例代码,这只是一个概念示例。我想不出一个好的并行示例,也无法共享我的实际代码。抱歉。我知道你要去哪儿了。只是类A、B和C可能需要方法1和方法2,但只有B和C可能需要属性1。这些类有几十个属性,而共享属性和方法的类不属于足够大的组,不便于创建单独的类。换句话说,将部分共享的属性和方法分离为单独的类将导致大量的抽象类。这可能就是我要做的。(注意:此注释中的属性名称与我发布的代码不一致。)大量的类是一件好事,而不是坏事。这是你坚持单一责任原则的一个标志。是的,但是大量只代表6个不同物理对象的类更像是一种黑客行为,因为这些类中的许多类除了包含属性之外根本没有责任。我发现自己用“AllButClassA”这样的名字来命名这些类,因为没有其他描述性的方法来命名它们。这听起来不像是一个有责任感的班级。不是真的不同意你,只是说它感觉不太好——特别是在可读性和可维护性方面。也许吧。很难和一个朋友谈论这类事情