基于访问器方法强制执行严格的继承

时间:2017-06-12 12:13:18

标签: java inheritance interface polymorphism abstract-class

鉴于基类定义为,

abstract Base{
    protected int field;
    protected int getter(){
        return this.field;
    }
    ...
}

为了对子类型进行分类,在此getter的基础上,我创建了一个类似的接口,

interface MyFieldGettable{
    public int getter();
}

我很高兴创建像

这样的子类型
class CantGetField extends Base{
    ....
}

因为,基本版本已经打​​印了该字段,所以让我们做补充子类型,

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return this.getter();
    }
}

现在,在一段代码中的某处有一个List<Base>,我想要分离这两种类型,并检查CanGetField类型的字段。因此,我写道,

for(Base b:listOfBase){
    if(b instanceof CanGetField){
        int field = ((CanGetField)b).getter();

而且,如果你们中的任何一个人现在已经猜到了。这吹进StackOverflowError。现在,我可以通过将类CanGetField的定义更正为

来解决这个问题
class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return this.field;
    }
}

或者,我可以在界面中更改getter方法的名称,并将子类型中的所有调用委托给base方法。但是,这将导致子类型中的大量冗余代码。

还有其他解决办法。

2 个答案:

答案 0 :(得分:2)

  

这会导致StackOverflowError。现在,我可以绕过这个   将类CanGetField的定义更正为,

getter()在这里进行无限递归调用:

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return this.getter();
    }
}

如果您想覆盖getter()方法只更改修饰符而不是其行为,则可以调用super.getter()

class CanGetField extends Base implements MyFieldGettable {
    public int getter(){
        return super.getter(); // super implementation
    }
}

答案 1 :(得分:0)

根据用户的建议,在问题的评论中。这就是我想要的,

product-listing.php

<!DOCTYPE html>
<html>
  <head>
    <title></title>
       <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
       <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
       <script src="bootstrap/js/jquery.min.js" ></script>
       <script src="bootstrap/js/bootstrap.min.js" ></script>
       <script src="test.js" ></script>
  </head>
  <body>
     <div class="container">
         <div class="col-md-12">
             <div id="get_something"></div>
         </div>
     </div>
  </body>
</html>

product-single-page.php

<!DOCTYPE html>
<html>
    <head>
        <title></title>
            <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
           <link  href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
           <script src="bootstrap/js/jquery.min.js" ></script>
           <script src="bootstrap/js/bootstrap.min.js" ></script>
           <script src="test.js" ></script>
     </head>
     <body>
        <div class="col-md-12">
            <input type="text" placeholder="I'm looking for..." class="for-control"  name="name" id="name" autocomplete="off" value="">
            <button type="submit" class="btn btn-primary" id="search_btn" name="submit">GO</button>
        </div>
     </body>
</html>


product-lis.js

$(document).ready(function()
{
   $("body").delegate("#search_btn","click",function(event)
   {
     event.preventDefault();
     var keyword = $("#name").val();
     var id = $('#name').val();
     $.ajax({
     url: "action.php",
     method: "POST",
     data : { search : 1 , id : id},
     success:function(data)
        {
         $("#get_something").html(data);
        }
     })    
   });
 })


action.php`

<?php
 if(isset($_POST['search']))
 {
   $val=$_POST['id'];
  ?>
  <h1><?php  echo $val; ?></h1>
  <?php
}
?>