GVKun编程网logo

使用Jersey的AbstractHttpContextInjectable的自定义方法注释不起作用(jersey注解)

8

在本文中,我们将给您介绍关于使用Jersey的AbstractHttpContextInjectable的自定义方法注释不起作用的详细内容,并且为您解答jersey注解的相关问题,此外,我们还将为您提

在本文中,我们将给您介绍关于使用Jersey的AbstractHttpContextInjectable的自定义方法注释不起作用的详细内容,并且为您解答jersey注解的相关问题,此外,我们还将为您提供关于angular2 Injectable http ng2使用服务(Injectable)加载(http)数据、asp.net-mvc – 在WebApi的ActionFilterAttribute的OnActionExecuted方法中修改HttpContent(actionExecutedContext.Response.Content)、c# – 使用Ninject,Httpcontext.Session始终为null、Class Abstraction -- Object Interfaces的知识。

本文目录一览:

使用Jersey的AbstractHttpContextInjectable的自定义方法注释不起作用(jersey注解)

使用Jersey的AbstractHttpContextInjectable的自定义方法注释不起作用(jersey注解)

如果要以非安全方式访问某些方法,我想限制它们。我正在创建一个@Secure批注,该批注检查请求是否通过安全通道发送。但是,我无法创建一个可注入的方法来捕获请求的HttpContext。

@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public @interface Secure {}public class SecureProvider<T> implements InjectableProvider<Secure, AbstractResourceMethod> {    @Override    public ComponentScope getScope() {        return ComponentScope.PerRequest;    }    @Override    public Injectable<?> getInjectable(ComponentContext componentContext,                                       Secure annotation,                                       AbstractResourceMethod method) {        return new SecureInjectable();    }}public class SecureInjectable<T> extends AbstractHttpContextInjectable<T> {    @Override    public T getValue(HttpContext context) {            // validation here        return null;    }}

我使用的是Dropwizard框架,因此提供程序的初始化应该像下面这样简单:

environment.addProvider(new SessionRestrictedToProvider<>(new SessionAuthenticator(), "MySession"));environment.addProvider(new SecureProvider<>());environment.setSessionHandler(new SessionHandler());

用法:

@Resource@Path("/account")public class AccountResource {    @GET    @Path("/test_secure")    @Secure    public Response isSecure() {        return Response.ok().build();    }}

在这一点上,我假设HttpContext Injectable在某种方法上不起作用,但是我对可以用来实现此注释的其他选项感到困惑。

答案1

小编典典

如果您不想使用AOP,我认为您可以通过实现ResourceMethodDispatchProvider和ResourceMethodDispatchAdapter来实现。

public class CustomDispatchProvider implements ResourceMethodDispatchProvider {ResourceMethodDispatchProvider provider;CustomDispatchProvider(ResourceMethodDispatchProvider provider){    this.provider = provider;}@Overridepublic RequestDispatcher create(AbstractResourceMethod abstractResourceMethod) {    System.out.println("creating new dispatcher for " + abstractResourceMethod);    RequestDispatcher defaultDispatcher = provider.create(abstractResourceMethod);    if (abstractResourceMethod.getMethod().isAnnotationPresent(Secure.class))        return new DispatcherDecorator(defaultDispatcher);    else        return defaultDispatcher;}@Providerpublic static class CustomDispatchAdapter implements ResourceMethodDispatchAdapter{    @Override    public ResourceMethodDispatchProvider adapt(ResourceMethodDispatchProvider provider) {        return new CustomDispatchProvider(provider);    }}public static class DispatcherDecorator implements RequestDispatcher{    private RequestDispatcher dispatcher;    DispatcherDecorator(RequestDispatcher dispatcher)    {        this.dispatcher = dispatcher;    }    public void dispatch(Object resource, HttpContext context) {        if (context.getRequest().isSecure())        {            System.out.println("secure request detected");            this.dispatcher.dispatch(resource, context);        }        else        {            System.out.println("request is NOT secure");            throw new RuntimeException("cannot access this resource over an insecure connection");        }    }}}

在Dropwizard中,像这样添加提供程序:environment.addProvider(CustomDispatchAdapter.class);

angular2 Injectable http ng2使用服务(Injectable)加载(http)数据

angular2 Injectable http ng2使用服务(Injectable)加载(http)数据

ng2依赖注入,服务中使用http获取服务器数据

1、 定义服务

import {Injectable} from "@angular/core";
import {Http,Jsonp} from "@angular/http";
import "rxjs/add/operator/map";
@Injectable()
export class AppServer {
  constructor(public http:Http,public jsonp:Jsonp) {

  }
  // http.get
  httpGet(url,params) {
    return this.http.get(url,{search: params}).map(result=>result.json());
  }
  // http.post
  httpPost(url,params) {
    return this.http.post(url,params).map(result=>result.json());
  }
  // jsonp
  jsonpGet(url,params) {
    return this.jsonp.get(url,{search: params}).map(result=>result.json());
  }
}

2、 定义组件, 加载服务

import {Component,OnInit} from "@angular/core";
    // 获取路由传递传递过来的params(id) 增加模块激活的路由(ActivatedRoute)
    import {ActivatedRoute} from "@angular/router";
    import {AppServer} from "./app.service";
    import {URLSearchParams} from "@angular/http";
    @Component({
        selector: "my-info",templateUrl: "../templates/about-info.html",providers: [AppServer]
    })
    
    export class AboutInfoComponent implements OnInit {
        // 定义一个变量,获取服务方法取得的数据
        info:Number;
        data:Array<Object>;
        // 初始化变量,这里必须加修饰词 public private,初始化服务,然后使用服务方法,调取数据
        constructor(public infos:AppServer) {
       
        }
    
        // 方法中操作id,通过id查询信息等等
        ngOnInit(){
            var url = "http://localhost:3000/login";
            var params = new URLSearchParams();
            params.set("id","1");
            // 传递过来的不是promise 所以要subscribe执行
            this.infos.getHttp(url,params).subscribe(res=> {
                console.log(res); 
            }
           );
        }
    }

3、 上面组件中局部加载了这个服务, 如果需要全局导入服务 app.module.ts文件中

providers: [AppServer]配置

asp.net-mvc – 在WebApi的ActionFilterAttribute的OnActionExecuted方法中修改HttpContent(actionExecutedContext.Response.Content)

asp.net-mvc – 在WebApi的ActionFilterAttribute的OnActionExecuted方法中修改HttpContent(actionExecutedContext.Response.Content)

我的WebApi操作方法返回IQueryable,我想通过Asp.Net WebApi(非MVC)中的ActionFilterattribute修改它(应用分页和过滤).
以下线程我得到了如何访问传递的模型:

.Net Web API IActionFilter.OnActionExecuted return type

但是如何用其他东西改变/替换整个模型呢?

解决方法

我找到了!

首先,我应该将actionExecutedContext.ActionContext.Response.Content转换为ObjectContent(您应该对项目中的System.Net.Http.Formatting.dll文件有所了解)

之后您可以简单地执行以下操作:

public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
    IEnumerable model = null;
    actionExecutedContext.Response.TryGetContentValue(out model);
    if (model != null)
    {
        IQueryable modelQuery = model.AsQueryable();

        //Do your modelQuery modification/replacement

        (actionExecutedContext.ActionContext.Response.Content as ObjectContent).Value = modelQuery;
    }

    base.OnActionExecuted(actionExecutedContext);
}

注意:要使用TryGetContentValue方法,需要使用System.Net.Http导入;命名空间虽然在上面的代码中调用这个方法并不重要.

::更新::

如果您需要更改Content的值类型(例如,返回字符串而不是IQueryable),则不能简单地更改该值.你应该创建一个这样的新内容:

var result = "Something new!";
var oldobjectContent = (actionExecutedContext.ActionContext.Response.Content as ObjectContent);
var newContent = new ObjectContent<string>(result,oldobjectContent.Formatter);
actionExecutedContext.ActionContext.Response.Content = newContent;

c# – 使用Ninject,Httpcontext.Session始终为null

c# – 使用Ninject,Httpcontext.Session始终为null

我正在使用像这样的ninject注入httpcontext
private void RegisterDependencyResolver()
{
    HttpContextBase context = new HttpContextwrapper(HttpContext.Current);
    var kernel = new StandardKernel();
    kernel.Bind<ISession>().To<SessionService>()
                            .InRequestScope()
                           .Withconstructorargument("context",ninjectContext => context);

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

在Application_start方法中调用RegisterDependencyResolver().

此接口注入到处理会话的类的构造函数中.

问题是会话从未初始化,所以我无法添加任何内容.

任何像context.session [“something”] =“something”的代码都会引发空引用异常.

Application_Start在生命周期中是否过早?我以为.InRequestScope()修复了这个问题,但它对我不起作用.

解决方法

如果您在IIS集成模式下运行,则无法访问Application_Start中的任何Http上下文对象.

试试这样:

private void RegisterDependencyResolver()
{
    kernel
        .Bind<ISession>()
        .To<SessionService>()
        .InRequestScope()
        .Withconstructorargument(
            "context",ninjectContext => new HttpContextwrapper(HttpContext.Current)
        );

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

Class Abstraction -- Object Interfaces

Class Abstraction -- Object Interfaces

<span>  1</span> <span>php
</span><span>  2</span> <span>/*</span>
<span>  3</span> <span>PHP 5 introduces abstract classes and methods. Classes defined as abstract may not be instantiated, and any class that contains at least one abstract method must also be abstract. Methods defined as abstract simply declare the method''s signature - they cannot define the implementation. 
</span><span>  4</span> 
<span>  5</span> <span>PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 
</span><span>  6</span> 
<span>  7</span> <span>When inheriting from an abstract class, all methods marked abstract in the parent''s class declaration must be defined by the child; additionally, these methods must be defined with the same (or a less restricted) visibility. For example, if the abstract method is defined as protected, the function implementation must be defined as either protected or public, but not private. Furthermore the signatures of the methods must match, i.e. the type hints and the number of required arguments must be the same. For example, if the child class defines an optional argument, where the abstract method''s signature does not, there is no conflict in the signature. This also applies to constructors as of PHP 5.4. Before 5.4 constructor signatures could differ.
</span><span>  8</span> <span>继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。 
</span><span>  9</span> 
<span> 10</span> <span>*/</span>
<span> 11</span> 
<span> 12</span> <span>abstract</span> <span>class</span><span> AbstractClass
</span><span> 13</span> <span>{
</span><span> 14</span>     <span>//</span><span>Force Extending class to define this method
</span><span> 15</span> <span>    // 强制要求子类定义这些方法</span>
<span> 16</span>     <span>abstract</span> <span>protected</span> <span>function</span><span> getValue();
</span><span> 17</span>     <span>abstract</span> <span>protected</span> <span>function</span> prefixValue(<span>$prefix</span><span>);
</span><span> 18</span> 
<span> 19</span>     <span>//</span><span> Common method 普通方法(非抽象方法)</span>
<span> 20</span>     <span>public</span> <span>function</span><span> printOut(){
</span><span> 21</span>         <span>print</span> <span>$this</span>-&gt;getValue().''<br>''<span>;
</span><span> 22</span> <span>    }
</span><span> 23</span> <span>}
</span><span> 24</span> 
<span> 25</span> <span>class</span> ConcreteClass1 <span>extends</span><span> AbstractClass
</span><span> 26</span> <span>{
</span><span> 27</span>     <span>protected</span> <span>function</span><span> getValue(){
</span><span> 28</span>         <span>return</span> ''ConcreteClass1''<span>;
</span><span> 29</span> <span>    }
</span><span> 30</span> 
<span> 31</span>     <span>public</span> <span>function</span> prefixValue(<span>$prefix</span><span>){
</span><span> 32</span>         <span>return</span> "{<span>$prefix</span>}".''ConcreteClass1''<span>;
</span><span> 33</span> <span>    }
</span><span> 34</span> <span>}
</span><span> 35</span> 
<span> 36</span> <span>class</span> ConcreteClass2 <span>extends</span><span> AbstractClass
</span><span> 37</span> <span>{
</span><span> 38</span>     <span>public</span> <span>function</span><span> getValue(){
</span><span> 39</span>         <span>return</span> ''ConcreteClass2''<span>;
</span><span> 40</span> <span>    }
</span><span> 41</span> 
<span> 42</span>     <span>public</span> <span>function</span> prefixValue(<span>$prefix</span><span>){
</span><span> 43</span>         <span>return</span> "{<span>$prefix</span>}".''ConcreteClass2''<span>;
</span><span> 44</span> <span>    }
</span><span> 45</span> <span>}
</span><span> 46</span> 
<span> 47</span> <span>/*</span>
<span> 48</span> <span>class ConcreteClass3 extends AbstractClass
</span><span> 49</span> <span>{
</span><span> 50</span> <span>    private function getValue(){
</span><span> 51</span> <span>        return ''ConcreteClass3'';
</span><span> 52</span> <span>    }//Fatal error: Access level to ConcreteClass3::getValue() must be protected (as in class AbstractClass) or weaker in 
</span><span> 53</span> 
<span> 54</span> <span>    public function prefixValue($prefix){
</span><span> 55</span> <span>        return "{$prefix}".''ConcreteClass3'';
</span><span> 56</span> <span>    }
</span><span> 57</span> <span>}
</span><span> 58</span> <span>*/</span>
<span> 59</span> 
<span> 60</span> 
<span> 61</span> <span>$class1</span> = <span>new</span><span> ConcreteClass1;
</span><span> 62</span> <span>$class1</span>-&gt;<span>printOut();
</span><span> 63</span> <span>echo</span> <span>$class1</span>-&gt;prefixValue(''FOO_'').''<br>''<span>;
</span><span> 64</span> 
<span> 65</span> <span>$class2</span> = <span>new</span><span> ConcreteClass2;
</span><span> 66</span> <span>$class2</span>-&gt;<span>printOut();
</span><span> 67</span> <span>echo</span> <span>$class2</span>-&gt;prefixValue(''FOO_'').''<br>''<span>;
</span><span> 68</span> 
<span> 69</span>  
<span> 70</span> 
<span> 71</span> <span>abstract</span> <span>class</span><span> AbstractClassB
</span><span> 72</span> <span>{
</span><span> 73</span>     <span>//</span><span> Our abstract method only needs to define the required arguments
</span><span> 74</span> <span>    // 我们的抽象方法仅需要定义需要的参数</span>
<span> 75</span>     <span>abstract</span> <span>protected</span> <span>function</span> prefixNameB(<span>$name</span><span>);
</span><span> 76</span> <span>}
</span><span> 77</span> 
<span> 78</span> <span>class</span> ConcreteClassB <span>extends</span><span> AbstractClassB
</span><span> 79</span> <span>{
</span><span> 80</span>     <span>//</span><span> Our child class may define optional arguments not in the parent''s signature
</span><span> 81</span> <span>    // 我们的子类可以定义父类签名中不存在的可选参数</span>
<span> 82</span>     <span>public</span> <span>function</span> prefixNameB(<span>$name</span>, <span>$separator</span> = ''.''<span>){
</span><span> 83</span>         <span>if</span> (<span>$name</span> == ''Pacman''<span>) {
</span><span> 84</span>             <span>$prefix</span> = ''Mr''<span>;
</span><span> 85</span>         } <span>elseif</span> (<span>$name</span> == ''Pacwoman''<span>) {
</span><span> 86</span>             <span>$prefix</span> = ''Mrs''<span>;
</span><span> 87</span>         } <span>else</span><span> {
</span><span> 88</span>             <span>$prefix</span> = ''''<span>;
</span><span> 89</span> <span>        }
</span><span> 90</span>         <span>return</span> "{<span>$prefix</span>}{<span>$separator</span>} {<span>$name</span>}"<span>;
</span><span> 91</span> <span>    }
</span><span> 92</span> <span>}
</span><span> 93</span> 
<span> 94</span> <span>$classB</span> = <span>new</span><span> ConcreteClassB;
</span><span> 95</span> <span>echo</span> <span>$classB</span>-&gt;prefixNameB(''Pacman''), ''<br>''<span>;
</span><span> 96</span> <span>echo</span> <span>$classB</span>-&gt;prefixNameB(''Pacwoman''), ''<br>''<span>;
</span><span> 97</span> 
<span> 98</span> 
<span> 99</span> <span>/*</span>
<span>100</span> <span>Object Interfaces 
</span><span>101</span> <span>Object interfaces allow you to create code which specifies which methods a class must implement, without having to define how these methods are handled. 
</span><span>102</span> <span>Interfaces are defined in the same was as a class, but with the interface keyword replacing the class keyword and without any of the methods having their contents defined. 
</span><span>103</span> <span>All methods declared in an interface must be public; this is the nature of an interface. 
</span><span>104</span> <span>对象接口 
</span><span>105</span> <span>使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 
</span><span>106</span> <span>接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 
</span><span>107</span> <span>接口中定义的所有方法都必须是公有,这是接口的特性。 
</span><span>108</span> 
<span>109</span> 
<span>110</span> 
<span>111</span> 
<span>112</span> <span>implements 
</span><span>113</span> <span>To implement an interface, the implements operator is used. All methods in the interface must be implemented within a class; failure to do so will result in a fatal error. Classes may implement more than one interface if desired by separating each interface with a comma. 
</span><span>114</span> <span>Note: 
</span><span>115</span> <span>Prior to PHP 5.3.9, a class could not implement two interfaces that specified a method with the same name, since it would cause ambiguity. More recent versions of PHP allow this as long as the duplicate methods have the same signature. 
</span><span>116</span> <span>Note: 
</span><span>117</span> <span>Interfaces can be extended like classes using the extends operator. 
</span><span>118</span> <span>Note: 
</span><span>119</span> <span>The class implementing the interface must use the exact same method signatures as are defined in the interface. Not doing so will result in a fatal error. 
</span><span>120</span> <span>Constants 
</span><span>121</span> <span>It''s possible for interfaces to have constants. Interface constants works exactly like class constants except they cannot be overridden by a class/interface that inherits them. 
</span><span>122</span> <span>实现(implements) 
</span><span>123</span> <span>要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。 
</span><span>124</span> <span>Note: 
</span><span>125</span> <span>实现多个接口时,接口中的方法不能有重名。 
</span><span>126</span> <span>Note: 
</span><span>127</span> <span>接口也可以继承,通过使用 extends 操作符。 
</span><span>128</span> <span>Note: 
</span><span>129</span> <span>类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误。 
</span><span>130</span> <span>常量 
</span><span>131</span> <span>接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。 
</span><span>132</span> 
<span>133</span> 
<span>134</span> <span>*/</span>
<span>135</span> 
<span>136</span> <span>//</span><span> Declare the interface ''iTemplate''</span>
<span>137</span> <span>interface</span><span> iTemplate
</span><span>138</span> <span>{
</span><span>139</span>     <span>public</span> <span>function</span> setVariable(<span>$name</span>, <span>$var</span><span>);
</span><span>140</span>     <span>public</span> <span>function</span> getHtml(<span>$template</span><span>);
</span><span>141</span> <span>}
</span><span>142</span> 
<span>143</span> <span>//</span><span> Implement the interface
</span><span>144</span> <span>// This will work</span>
<span>145</span> 
<span>146</span> <span>class</span> Template <span>implements</span><span> iTemplate
</span><span>147</span> <span>{
</span><span>148</span>     <span>private</span> <span>$vars</span> = <span>array</span><span>();
</span><span>149</span> 
<span>150</span>     <span>public</span> <span>function</span> setVariable(<span>$name</span>, <span>$var</span><span>)
</span><span>151</span> <span>    {
</span><span>152</span>         <span>$this</span>-&gt;vars[<span>$name</span>] = <span>$var</span><span>;
</span><span>153</span> <span>    }
</span><span>154</span> 
<span>155</span>     <span>public</span> <span>function</span> getHtml(<span>$template</span><span>)
</span><span>156</span> <span>    {
</span><span>157</span>         <span>foreach</span> (<span>$this</span>-&gt;vars <span>as</span> <span>$name</span> =&gt; <span>$value</span><span>) {
</span><span>158</span>             <span>$template</span> = <span>str_replace</span>(''{''.<span>$name</span>.''}'', <span>$value</span>, <span>$template</span><span>);
</span><span>159</span> <span>        }
</span><span>160</span>         <span>return</span> <span>$template</span><span>;
</span><span>161</span> <span>    }
</span><span>162</span> <span>}
</span><span>163</span> 
<span>164</span> <span>/*</span>
<span>165</span> <span>class BadTemplate implements iTemplate
</span><span>166</span> <span>{
</span><span>167</span> <span>    private $var = array();
</span><span>168</span> <span>    public function setVariable($name, $var)
</span><span>169</span> <span>    {
</span><span>170</span> <span>        $this-&gt;vars[$name] = $var;
</span><span>171</span> <span>    }
</span><span>172</span> <span>}
</span><span>173</span> <span>Fatal error: Class BadTemplate contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (iTemplate::getHtml) 
</span><span>174</span> 
<span>175</span> <span>*/</span>
<span>176</span> 
<span>177</span> <span>/*</span>
<span>178</span> <span>class BadTemplate implements iTemplate
</span><span>179</span> <span>{
</span><span>180</span> <span>    private $vars = array();
</span><span>181</span> 
<span>182</span> <span>    public function setVariable($name, $var,$echo)
</span><span>183</span> <span>    {
</span><span>184</span> <span>        //Fatal error: Declaration of BadTemplate::setVariable() must be compatible with iTemplate::setVariable($name, $var)
</span><span>185</span> 
<span>186</span> <span>        $this-&gt;vars[$name] = $var;
</span><span>187</span> <span>        echo $echo;
</span><span>188</span> <span>    }
</span><span>189</span> 
<span>190</span> <span>    public function getHtml($template)
</span><span>191</span> <span>    {
</span><span>192</span> <span>        foreach ($this-&gt;vars as $name =&gt; $value) {
</span><span>193</span> <span>            $template = str_replace(''{''.$name.''}'', $value, $template);
</span><span>194</span> <span>        }
</span><span>195</span> <span>        return $template;
</span><span>196</span> <span>    }
</span><span>197</span> <span>}
</span><span>198</span> <span>*/</span>
<span>199</span> 
<span>200</span> <span>/*</span>
<span>201</span> <span>class BadTemplate implements iTemplate
</span><span>202</span> <span>{
</span><span>203</span> <span>    private $vars = array();
</span><span>204</span> 
<span>205</span> <span>    // Fatal error: Access level to BadTemplate::setVariable() must be public (as in class iTemplate)
</span><span>206</span> 
<span>207</span> <span>    protected function setVariable($name, $var)
</span><span>208</span> <span>    {
</span><span>209</span>         
<span>210</span> <span>        $this-&gt;vars[$name] = $var;
</span><span>211</span> <span>    }
</span><span>212</span> 
<span>213</span> <span>    public function getHtml($template)
</span><span>214</span> <span>    {
</span><span>215</span> <span>        foreach ($this-&gt;vars as $name =&gt; $value) {
</span><span>216</span> <span>            $template = str_replace(''{''.$name.''}'', $value, $template);
</span><span>217</span> <span>        }
</span><span>218</span> <span>        return $template;
</span><span>219</span> <span>    }
</span><span>220</span> <span>}
</span><span>221</span> 
<span>222</span> <span>*/</span>
<span>223</span> 
<span>224</span> 
<span>225</span> 
<span>226</span> <span>interface</span><span> a
</span><span>227</span> <span>{
</span><span>228</span>     <span>public</span> <span>function</span><span> foo();
</span><span>229</span> <span>}
</span><span>230</span> 
<span>231</span> <span>interface</span> b <span>extends</span><span> a 
</span><span>232</span> <span>{
</span><span>233</span>     <span>public</span> <span>function</span> baz(Baz <span>$baz</span><span>);
</span><span>234</span> <span>}
</span><span>235</span> 
<span>236</span> <span>class</span> c <span>implements</span><span> b
</span><span>237</span> <span>{
</span><span>238</span>     <span>public</span> <span>function</span><span> foo()
</span><span>239</span> <span>    {
</span><span>240</span> 
<span>241</span> <span>    }
</span><span>242</span> 
<span>243</span>     <span>public</span> <span>function</span> baz(Baz <span>$baz</span><span>)
</span><span>244</span> <span>    {
</span><span>245</span> 
<span>246</span> <span>    }
</span><span>247</span> <span>}
</span><span>248</span> 
<span>249</span> <span>/*</span>
<span>250</span> <span>Fatal error: Declaration of d::baz() must be compatible with b::baz(Baz $baz)
</span><span>251</span> 
<span>252</span> <span>class d implements b
</span><span>253</span> <span>{
</span><span>254</span> <span>    public function foo()
</span><span>255</span> <span>    {
</span><span>256</span> 
<span>257</span> <span>    }
</span><span>258</span> 
<span>259</span> <span>    public function baz(Foo $foo)
</span><span>260</span> <span>    {
</span><span>261</span> 
<span>262</span> <span>    }
</span><span>263</span> <span>}
</span><span>264</span> <span>*/</span>
<span>265</span> 
<span>266</span> 
<span>267</span> <span>//</span><span>Multiple interface inheritance 继承多个接口</span>
<span>268</span> 
<span>269</span> <span>interface</span><span> a1 
</span><span>270</span> <span>{
</span><span>271</span>     <span>public</span> <span>function</span><span> foo();
</span><span>272</span> <span>}
</span><span>273</span> 
<span>274</span> <span>interface</span><span> b1
</span><span>275</span> <span>{
</span><span>276</span>     <span>public</span> <span>function</span><span> bar();
</span><span>277</span> <span>}
</span><span>278</span> 
<span>279</span> <span>interface</span> c1 <span>extends</span> a1,<span> b1
</span><span>280</span> <span>{
</span><span>281</span>     <span>public</span> <span>function</span><span> baz();
</span><span>282</span> <span>}
</span><span>283</span> 
<span>284</span> <span>class</span> d1 <span>implements</span><span> c1
</span><span>285</span> <span>{
</span><span>286</span>     <span>public</span> <span>function</span><span> foo()
</span><span>287</span> <span>    {
</span><span>288</span> <span>    }
</span><span>289</span> 
<span>290</span>     <span>public</span> <span>function</span><span> bar()
</span><span>291</span> <span>    {
</span><span>292</span> <span>    }
</span><span>293</span> 
<span>294</span>     <span>public</span> <span>function</span><span> baz()
</span><span>295</span> <span>    {
</span><span>296</span> <span>    }
</span><span>297</span> <span>}
</span><span>298</span> 
<span>299</span> <span>//</span><span>Interfaces with constants 使用接口常量</span>
<span>300</span> <span>interface</span><span> a2
</span><span>301</span> <span>{
</span><span>302</span>     <span>const</span> b2 = ''Interface constant''<span>;
</span><span>303</span> <span>}
</span><span>304</span> 
<span>305</span> <span>echo</span> a2::<span>b2;
</span><span>306</span> 
<span>307</span> <span>/*</span>
<span>308</span> <span> Fatal error: Cannot inherit previously-inherited or override constant b2 from interface a2 
</span><span>309</span> <span> 错误写法,因为常量不能被覆盖。接口常量的概念和类常量是一样的。
</span><span>310</span> 
<span>311</span> <span>class c2 implements a2
</span><span>312</span> <span>{
</span><span>313</span> <span>    const  b2 =''Class constant'';
</span><span>314</span> <span>}
</span><span>315</span> 
<span>316</span> <span>*/</span>
登录后复制

 http://php.net/

 

小结:

0-子类需定义抽象类所有方法,方法参数个数可以添加,访问控制同或弱,而对象接口的实现也需要实现全部方法,但是参数个数不可更改,且访问控制必须public。

发问:

0-框架中的实例?

今天关于使用Jersey的AbstractHttpContextInjectable的自定义方法注释不起作用jersey注解的分享就到这里,希望大家有所收获,若想了解更多关于angular2 Injectable http ng2使用服务(Injectable)加载(http)数据、asp.net-mvc – 在WebApi的ActionFilterAttribute的OnActionExecuted方法中修改HttpContent(actionExecutedContext.Response.Content)、c# – 使用Ninject,Httpcontext.Session始终为null、Class Abstraction -- Object Interfaces等相关知识,可以在本站进行查询。

本文标签: