c# - 通过 OOP 继承,我如何在 'child' 类中保持较低的参数量

标签 c# oop

所以对于继承,我总是发现自己在处理最具体的类中的超长构造函数。我正在寻找可以避免此问题的范例或方法。我想过使用工厂,但如果我这样做了,我仍然必须使用工厂中的构造函数。不管这个想法如何,我能做些什么来减少构造函数参数的长度吗?

例如:

abstract class DrawableComponent : Component, ITransformable, IScalable, IDrawable, IRotatable

是一个带有构造函数的子类

DrawableComponent(string Name, int SizeX, int SizeY, int X, int Y, float Rotation) : base(Name) { ... }

现在假设我想用它做一个 child 。事情变得更加复杂和丑陋。

class TextBoxComponent : DrawableComponent, IRenderable

构造函数现在变得非常长:

public TextBoxComponent(
    IDrawableUnit Background,
    IDrawableUnit Text,
    string Name,
    int X,
    int Y,
    int SX,
    int SY)
: base(Name, SX,SY,X,Y,0.0f)
{
    this.Background = Background;
    this.Foreground = Foreground;
}

总而言之,我厌倦了这样的事情:

class Blah {Blah(blah)}
class childBlah : Blah {childBlah(blah,blahs,blaha) : base (blah)}
class grandChildBlah : childBlah {grandChildBlah(blah, blahs, blaha, blaht, blauh) : base(blah,blahs,blaha) }

最佳答案

如果您的构造函数参数列表真的很长,那么您必须在一个类中有很多字段?这表明您应该考虑将这些类拆分为多个类,或者将相关字段组提取到它们自己的类型中。

例如,x 和 y 坐标字段或宽度和高度值:

private double mX;
private double mY;
private double mWidth;
private double mHeight;

实际上应该是单个点或矢量或矩形对象:

private vector mPosition;
private vector mSize;

// or

private rectangle mRegion;

另一个建议可能是减少继承,而是使用组合。代替is-a 关系,使用has-a 关系:

然后你的'blah'例子变成了这样的:

class Blah
{
   Blah(int blah) { ... }
}

class ChildBlah
{
   Blah mBlah;
   ...
   ChildBlah(Blah blah, int blahs, int blaha)
   { mBlah = blah; ... }
}

class GrandChildBlah
{
   ChildBlah mChildBlah;
   ...
   GrandChildBlah(ChildBlah blah, int blaht, int blahu)
   { mChildBlah = blah; ... }
}

关于c# - 通过 OOP 继承,我如何在 'child' 类中保持较低的参数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10728526/

相关文章:

perl - 当从 Perl 模块调用方法时,为什么 '::' 和 '->' 可以互换工作(某种程度上)?

c# - 在我的用户控件中找不到 GotFocus()/LostFocus()

c# - 如何在 View 中计算总​​计?

c# - 使用C#访问网站

java - 在类中使用共享服务

java - 在重写期间使用泛型 Map 参数将具体对象返回到泛型方法

javascript - 查找对象中的所有变量时出现问题

java - 我需要一个只有一个实现的接口(interface)吗?

c# - 浏览器是否缓存动态图像?

c# - MEF 自定义属性类是否需要 ctor(IDictionary<,>)