我有一个这样定义的类:
public class SearchDishes extends AppCompatActivity implements SearchView.OnQueryTextListener{
List<DetailsofAd> productList;
RecyclerView recyclerView;
android.support.v7.widget.Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_dishes);
toolbar=(android.support.v7.widget.Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(toolbar);
recyclerView = (RecyclerView) findViewById(R.id.recylcermain);
empty=(TextView) findViewById(R.id.empty);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
productList = new ArrayList<>(); }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_bar,menu);
MenuItem menuItem=menu.findItem(R.id.search);
android.support.v7.widget.SearchView searchView=(android.support.v7.widget.SearchView)menuItem.getActionView();
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
newText=newText.toLowerCase();
ArrayList<DetailsofAd> newList=new ArrayList<>();
for (DetailsofAd detailsofAd : newList)
{
String title=detailsofAd.getTitle().toLowerCase();
if (title.contains(newText))
{
newList.add(detailsofAd);
}
}
AdlistAdapter adapter = new AdlistAdapter(SearchDishes.this, newList);
adapter.setFilter(newList);
return false;
}
我有一个抽象类
export class Layer
{
public raster: BaseRaster;
constructor(raster: BaseRaster)
{
this.raster = raster;
}
}
我有多个栅格类:即
export abstract class BaseRaster
{
public doBasicStuff(): void { ... }
}
当我这样做
export class ValueRaster extends BaseRaster
{
public doMoreStuff(): void { ... }
}
export class ZoneRaster extends BaseRaster
{
public doMoreStuff(): void { ... }
}
layer.raster将为BaseRaster类型-其他语言无法正常工作。
我遇到的问题是layer.raster.doMoreStuff()不是BaseRaster的一部分,因此失败了。
我求助于类型检查:
let valueRaster = new ValueRaster();
let layer = new Layer(valueRaster);
layer.raster.doMoreStuff(); // fails!
有效,但麻烦。
我可以使多态性在Typescript中正常工作吗?也就是说,如果我要在Java / C ++ / C#中执行相同的操作,则调用layer.raster.doMoreStuff()会起作用,因为在构造Layer时它会保留类类型(奇怪的是Typescript知道构造函数名称,但不保留类)。
答案 0 :(得分:2)
对于您想要的东西感到困惑,如果您想要某种类型的BaseRaster的超集,那么您可以像这样使用通用约束来键入它……
这篇文章中缺少一些类,因此我为这个示例创建了一些假类。
class BaseRaster {
baseRasterMethod() {
return "hello"
}
}
class BaseClass extends BaseRaster {}
export class Layer<T extends BaseRaster> {
public raster: T;
constructor(raster: T)
{
this.raster = raster;
}
}
export class ValueRaster extends BaseClass
{
public newFunction() {
return "newFunction"
}
}
let valueRaster = new ValueRaster();
let layer = new Layer(valueRaster);
layer.raster.newFunction // works.
答案 1 :(得分:0)
结果证明我在声明BaseRaster时犯了一个错误。这是正确的代码:
export abstract class BaseRaster
{
public doBasicStuff(): void { ... }
abstract public doMoreStuff(): void;
}
layer.raster.doMoreStuff(); // works!