我读到你可以为对象添加额外的方法,或者以这种方式覆盖抽象方法,但是我有一个错误。你能告诉我这是否可能或我做错了什么?
public abstract class Pesti {
public abstract void ud();
}
public class EX2 {
public static void main(String[] args) {
Pesti p = new Pesti() {
public void ud() {
System.out.println("Pestele este ud!");
}
public void inn() {
System.out.println("Innoata!");
}
};
p.ud();
p.inn();
}
}
它告诉我它无法找到方法inn
。
答案 0 :(得分:6)
您正在做的是创建var result = Cars
.FirstOrDefault(car=>Conditions.Any(cond=>
cond.Speed == car.Speed && cond.Color == car.Color));
的匿名子类。但是,由于Pesti
变量的类型为p
,因此只能调用Pesti
类(或其任何超类)中声明的方法。因此,您可以拨打Pesti
,但不能拨打ud()
。
如果您可以将inn()
转换为子类的类型,则可以调用p
,但由于这是一个匿名子类实例,因此您无法转换为那种类型。
您可以在inn()
中将inn()
声明为抽象(或具体)方法。然后你的代码将通过编译,并且将执行匿名子类实例中此方法的实现。
Pesti
答案 1 :(得分:1)
您将use Mojo::Base -strict;
use Test::Mojo;
use Test::More;
package MyApp::Example;
use Mojo::Base 'Mojolicious::Controller';
sub search {
my ($self, $args, $cb) = @_;
$self->$cb($args, 200);
}
package main;
use Mojolicious::Lite;
plugin Swagger2 => {url => 'data://main/multi-param.json'};
my $t = Test::Mojo->new;
$t->get_ok('/search?myfield=1&myfield=2&myfield=3')->status_is(200)->json_is('/myfield', [1, 2, 3]);
done_testing;
__DATA__
@@ multi-param.json
{
"swagger": "2.0",
"info": {"version": "1.0", "title": "Test multi"},
"paths": {
"/search": {
"get": {
"x-mojo-controller": "MyApp::Example",
"operationId": "search",
"parameters": [
{
"name": "myfield",
"in": "query",
"type": "array",
"collectionFormat": "multi",
"uniqueItems": true,
"items": { "type": "string" },
"required": false
}
],
"responses": {
"200": {"description": "whatever", "schema": {"type": "object"}}
}
}
}
}
}
声明为p
的实例,但尝试使用Pesti
中未定义的方法。将对象声明为抽象类时,只能使用此类中定义的方法。要使用Pesti
方法,您还必须在Pesti类中声明此方法。另外,您可以编写一个扩展inn()
的类来实现Pesti
方法,并将您的对象声明为扩展类。
答案 2 :(得分:0)
Pesti
是一个abstract
类,只有一种方法(abstract
):ud()
。因此,使用类型Pesti
声明的变量只能用于调用ud()
或类Object
(Pesti
的隐式超类)中的任何方法。使用此类型声明p
,因此尽管实际上是方法inn()
的{{3}}实例,但在声明变量的上下文中此方法不可用输入Pesti
。
也许您打算将inn()
方法添加到Pesti
,以便所有实例都必须实现它:
public abstract class Pesti {
public abstract void ud();
public abstract void inn();
}
或者您可能根本不想使用匿名类,并希望使用Pesti
方法创建inn()
的子类:
public class PestiImpl extends Pesti {
@Override
public void ud() {
System.out.println("Pestele este ud!");
}
public void inn() {
System.out.println("Innoata!");
}
}
(或者你可以在两者之间有一层继承;一些abstract
类扩展Pesti
,inn()
声明为abstract
方法,如果你有其他类像这样inn()
方法,但有些Pesti
没有)。
附注:我强烈建议在适当的地方使用anonymous class注释,以使代码更具可读性,并避免在尝试覆盖方法时出现拼写错误。您可以让大多数IDE自动插入它。
答案 3 :(得分:-1)
认为你需要看看这个link,我不知道你想做什么,但是你无法实例化抽象类,你可以在我的链接中找到详细的描述,希望它能够帮助你