【问题标题】:Best way to fix this inheritance structure? [closed]修复这种继承结构的最佳方法是什么? [关闭]
【发布时间】:2016-04-04 13:44:51
【问题描述】:

我目前正在处理一个 Java 项目,我有 3 个从抽象类 N 继承的类(I、H 和 O)。其中 I 和 O 需要在类 S 中描述的属性,而类 H 和 O 需要描述的属性在类 P 中。属性 P 和 S 都不能用接口生成。这会导致问题,如果我要实现这样的结构: N->P N -> S 和 I -> S,O -> S 和 O -> P, H -> P
但这在 java 中是不可能的,因为它不允许多重继承。 一个合乎逻辑的解决方案是让 S 从 P 继承, P 从 N 继承。但这会导致问题,即 I 具有 P 中不需要的属性。

我正在寻找一种干净的方式来实现它,感谢您的阅读!

【问题讨论】:

  • -> 是什么意思?你的意思是“实现”还是“被实现”?
  • 我倾向于阅读 -> 作为“使用”,这是正确的吗?我不知道你所说的“财产”到底是什么意思。我的直接想法是拥有接口 UsesP 和 UsesS 并让使用 P 和 S 的类实现它们——或者你说的那是不可能的??

标签: java inheritance polymorphism


【解决方案1】:

尝试抽象出接口中的通用属性。

【讨论】:

    【解决方案2】:

    I 关系到:“属性 P 和 S 都不能使用接口。”。

    如果需要获取字段值,只需定义要实现的方法,如:

    public interface MyInterface{
     void getPropertyOne();
     void getPropertyTwo();
    }
    

    请记住,由于 Java8,您可以在 Java 接口上获得默认方法,如果您需要为某些子类实现相同的实现,或者您可以使用抽象类获得类似的行为,这可能会很有用。

    【讨论】:

    • 感谢这确实是解决问题的好方法。
    【解决方案3】:

    似乎您需要将 PS 类设为单例并使用 Composition over Inheritance。换句话说,您可以从PS 中获益,将它们用作IOH 中的composite collaborators。 将 N 保留为抽象,但前提是 N 提供一组通用的方法和字段。换句话说 = N 是每个类的模板。

    这是我的看法:

    class I extends N {
        private S s;
    
        public I(S s) {
            this.s = s; 
        }
    }
    
    class O extends N {
        private S s;
        private P p;
    
        public O(S s, P p) {
            this.s = s; 
            this.p = p;
        }
    }
    
    class H extends N {
        private P p;
    
        public H(P p) {
            this.p = p; 
        }
    }
    
    interface P {
        public String getProperty();
    }
    interface S  {
        public String getProperty();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多