【问题标题】:Are casts a sign of bad design? [closed]演员表是糟糕设计的标志吗? [关闭]
【发布时间】:2013-02-17 01:01:24
【问题描述】:

我有这种情况:

public abstract class ClassA{

    public ClassA getClassOfSameKind(){
        return this.getClass().newInstance();
    }

}

public abstract class ClassB extends ClassA{

    public void doSomethingSpecial(){
        ClassB otherClass = (ClassB) this.getClassOfSameKind();
        //do something special that only Class B can do
    }

}

你会做不同的事情吗?

【问题讨论】:

  • 你很幸运,这并没有像你想象的那样。
  • 类型转换本质上并不是糟糕设计的标志。
  • 这可能是糟糕的设计,但其中没有演员表。您没有告诉我们您要解决的问题足够多,我们无法告诉您我们会采取哪些不同的做法。
  • 我想知道@BrianRoach 是如何知道 OP 的想法的。还有唐罗比,代码确实包含演员表......
  • 抱歉,它确实包含演员表。我的其余评论是有效的。

标签: java design-patterns casting


【解决方案1】:

使用协变返回类型可以避免这种强制转换:

public abstract class ClassA{

    public abstract ClassA getClassOfSameKind();

}

public abstract class ClassB extends ClassA{

    @Override
    public abstract ClassB getClassOfSameKind();

    public void doSomethingSpecial(){
        ClassB otherClass = this.getClassOfSameKind();
        //do something special that only Class B can do
    }

}

public class ClassC extends ClassB {
    @Override
    public ClassC getClassOfSameKind() {
        return new ClassC();
    }
}

【讨论】:

  • 这在客观上比我原来的设计要好,因为铸件被分成了另一种方法。版主没有花足够的时间思考一些问题...
  • @LayGonzález - 1) 客观上并没有更好。现在每个叶子类都必须实现这个方法。因此重复代码 - 违反 DRY 原则。 2)投票关闭的不是版主。 3)投票结束的原因是这个问题不能有一个客观正确的答案,因为没有一个。
  • @StephenC 每个叶子都是一个不同的类,因此,每个演员都是不同的,并且没有违反 DRY 原则。主持人是可以主持的人。
  • @LayGonzález - “主持人是可以主持的人”。不在SO上。在 SO 上,版主是指名字旁边有蓝色菱形的人。他们可以做高级代表无法做到的事情。像 override 投票关闭、暂停人员等。
  • @LayGonzález - DRY 意味着不要重复自己。所有这些重载只是在重复自己。您的原始版本证明不需要重复。
【解决方案2】:

如果你想避免这种类型转换,那么你可以这样写:

public void doSomethingSpecial(){
    ClassB otherClass = this.getClass().newInstance();
    // ...
}

...或其他方式。

但老实说,除非代码包含 大量 对需要类型转换的 getClassOfSameKind() 方法的调用,否则我不会打扰。


演员表是糟糕设计的标志吗?

IMO,不。当然,不是一般的。

在某些情况下确实如此,尤其是当类型转换硬连线假设某些对象具有特定类型而没有可靠的基础时。例如:

private ClassB otherB;

public void setOther(ClassA other) {
    this.otherB = (ClassB) otherB;  // It's always a ClassB.  She'll be right ...
}

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2012-09-06
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多