鉴于基类定义为,
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方法。但是,这将导致子类型中的大量冗余代码。
还有其他解决办法。
答案 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
}
?>