| <!DOCTYPE html> |
| <!--[if IE]><![endif]--> |
| <html> |
| |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| <title>Class VirtualMethod |
| | Apache Lucene.NET 4.8.0-beta00013 Documentation </title> |
| <meta name="viewport" content="width=device-width"> |
| <meta name="title" content="Class VirtualMethod |
| | Apache Lucene.NET 4.8.0-beta00013 Documentation "> |
| <meta name="generator" content="docfx 2.56.2.0"> |
| |
| <link rel="shortcut icon" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/logo/favicon.ico"> |
| <link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.vendor.css"> |
| <link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.css"> |
| <link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/main.css"> |
| <meta property="docfx:navrel" content="toc.html"> |
| <meta property="docfx:tocrel" content="core/toc.html"> |
| |
| <meta property="docfx:rel" content="https://lucenenet.apache.org/docs/4.8.0-beta00009/"> |
| |
| </head> |
| <body data-spy="scroll" data-target="#affix" data-offset="120"> |
| <span id="forkongithub"><a href="https://github.com/apache/lucenenet" target="_blank">Fork me on GitHub</a></span> |
| <div id="wrapper"> |
| <header> |
| |
| <nav id="autocollapse" class="navbar ng-scope" role="navigation"> |
| <div class="container"> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| |
| <a class="navbar-brand" href="/"> |
| <img id="logo" class="svg" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/logo/lucene-net-color.png" alt=""> |
| </a> |
| </div> |
| <div class="collapse navbar-collapse" id="navbar"> |
| <form class="navbar-form navbar-right" role="search" id="search"> |
| <div class="form-group"> |
| <input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off"> |
| </div> |
| </form> |
| </div> |
| </div> |
| </nav> |
| |
| <div class="subnav navbar navbar-default"> |
| <div class="container hide-when-search"> |
| <ul class="level0 breadcrumb"> |
| <li> |
| <a href="https://lucenenet.apache.org/docs/4.8.0-beta00009/">API</a> |
| <span id="breadcrumb"> |
| <ul class="breadcrumb"> |
| <li></li> |
| </ul> |
| </span> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </header> |
| <div class="container body-content"> |
| |
| <div id="search-results"> |
| <div class="search-list"></div> |
| <div class="sr-items"> |
| <p><i class="glyphicon glyphicon-refresh index-loading"></i></p> |
| </div> |
| <ul id="pagination"></ul> |
| </div> |
| </div> |
| <div role="main" class="container body-content hide-when-search"> |
| |
| <div class="sidenav hide-when-search"> |
| <a class="btn toc-toggle collapse" data-toggle="collapse" href="#sidetoggle" aria-expanded="false" aria-controls="sidetoggle">Show / Hide Table of Contents</a> |
| <div class="sidetoggle collapse" id="sidetoggle"> |
| <div id="sidetoc"></div> |
| </div> |
| </div> |
| <div class="article row grid-right"> |
| <div class="col-md-10"> |
| <article class="content wrap" id="_content" data-uid="Lucene.Net.Util.VirtualMethod"> |
| |
| |
| <h1 id="Lucene_Net_Util_VirtualMethod" data-uid="Lucene.Net.Util.VirtualMethod" class="text-break">Class VirtualMethod |
| </h1> |
| <div class="markdown level0 summary"><p>A utility for keeping backwards compatibility on previously abstract methods |
| (or similar replacements). |
| <p>Before the replacement method can be made abstract, the old method must kept deprecated. |
| If somebody still overrides the deprecated method in a non-sealed class, |
| you must keep track, of this and maybe delegate to the old method in the subclass. |
| The cost of reflection is minimized by the following usage of this class:</p> |
| <p>Define <strong>static readonly</strong> fields in the base class (<code>BaseClass</code>), |
| where the old and new method are declared:</p></p> |
| <pre><code>internal static readonly VirtualMethod newMethod = |
| new VirtualMethod(typeof(BaseClass), "newName", parameters...); |
| internal static readonly VirtualMethod oldMethod = |
| new VirtualMethod(typeof(BaseClass), "oldName", parameters...);</code></pre> |
| <p>this enforces the singleton status of these objects, as the maintenance of the cache would be too costly else. |
| If you try to create a second instance of for the same method/<code>baseClass</code> combination, an exception is thrown.</p> |
| <p>To detect if e.g. the old method was overridden by a more far subclass on the inheritance path to the current |
| instance's class, use a <strong>non-static</strong> field:</p> |
| <pre><code> bool isDeprecatedMethodOverridden = |
| oldMethod.GetImplementationDistance(this.GetType()) > newMethod.GetImplementationDistance(this.GetType()); |
| |
| <em>// alternatively (more readable):</em> |
| bool isDeprecatedMethodOverridden = |
| VirtualMethod.CompareImplementationDistance(this.GetType(), oldMethod, newMethod) > 0</code></pre> |
| <p><a class="xref" href="Lucene.Net.Util.VirtualMethod.html#Lucene_Net_Util_VirtualMethod_GetImplementationDistance_System_Type_">GetImplementationDistance(Type)</a> returns the distance of the subclass that overrides this method. |
| The one with the larger distance should be used preferable. |
| this way also more complicated method rename scenarios can be handled |
| (think of 2.9 <a class="xref" href="Lucene.Net.Analysis.TokenStream.html">TokenStream</a> deprecations).</p> |
| |
| <div class="lucene-block lucene-internal">This is a Lucene.NET INTERNAL API, use at your own risk</div></div> |
| <div class="markdown level0 conceptual"></div> |
| <div class="inheritance"> |
| <h5>Inheritance</h5> |
| <div class="level0"><span class="xref">System.Object</span></div> |
| <div class="level1"><span class="xref">VirtualMethod</span></div> |
| </div> |
| <div class="inheritedMembers"> |
| <h5>Inherited Members</h5> |
| <div> |
| <span class="xref">System.Object.Equals(System.Object)</span> |
| </div> |
| <div> |
| <span class="xref">System.Object.Equals(System.Object, System.Object)</span> |
| </div> |
| <div> |
| <span class="xref">System.Object.GetHashCode()</span> |
| </div> |
| <div> |
| <span class="xref">System.Object.GetType()</span> |
| </div> |
| <div> |
| <span class="xref">System.Object.MemberwiseClone()</span> |
| </div> |
| <div> |
| <span class="xref">System.Object.ReferenceEquals(System.Object, System.Object)</span> |
| </div> |
| <div> |
| <span class="xref">System.Object.ToString()</span> |
| </div> |
| </div> |
| <h6><strong>Namespace</strong>: <a class="xref" href="Lucene.Net.Util.html">Lucene.Net.Util</a></h6> |
| <h6><strong>Assembly</strong>: Lucene.Net.dll</h6> |
| <h5 id="Lucene_Net_Util_VirtualMethod_syntax">Syntax</h5> |
| <div class="codewrapper"> |
| <pre><code class="lang-csharp hljs">public sealed class VirtualMethod</code></pre> |
| </div> |
| <h3 id="constructors">Constructors |
| </h3> |
| <span class="small pull-right mobile-hide"> |
| <span class="divider">|</span> |
| <a href="https://github.com/apache/lucenenet/new/docs/4.8.0-beta00013/websites/apidocs/apiSpec/new?filename=Lucene_Net_Util_VirtualMethod__ctor_System_Type_System_String_System_Type___.md&value=---%0Auid%3A%20Lucene.Net.Util.VirtualMethod.%23ctor(System.Type%2CSystem.String%2CSystem.Type%5B%5D)%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a> |
| </span> |
| <span class="small pull-right mobile-hide"> |
| <a href="https://github.com/NightOwl888/lucenenet/blob/fix/apidocs-layout/src/Lucene.Net/Util/VirtualMethod.cs/#L120">View Source</a> |
| </span> |
| <a id="Lucene_Net_Util_VirtualMethod__ctor_" data-uid="Lucene.Net.Util.VirtualMethod.#ctor*"></a> |
| <h4 id="Lucene_Net_Util_VirtualMethod__ctor_System_Type_System_String_System_Type___" data-uid="Lucene.Net.Util.VirtualMethod.#ctor(System.Type,System.String,System.Type[])">VirtualMethod(Type, String, Type[])</h4> |
| <div class="markdown level1 summary"><p>Creates a new instance for the given <code data-dev-comment-type="paramref" class="paramref">baseClass</code> and method declaration. </p> |
| </div> |
| <div class="markdown level1 conceptual"></div> |
| <h5 class="decalaration">Declaration</h5> |
| <div class="codewrapper"> |
| <pre><code class="lang-csharp hljs">public VirtualMethod(Type baseClass, string method, params Type[] parameters)</code></pre> |
| </div> |
| <h5 class="parameters">Parameters</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Name</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Type</span></td> |
| <td><span class="parametername">baseClass</span></td> |
| <td></td> |
| </tr> |
| <tr> |
| <td><span class="xref">System.String</span></td> |
| <td><span class="parametername">method</span></td> |
| <td></td> |
| </tr> |
| <tr> |
| <td><span class="xref">System.Type</span>[]</td> |
| <td><span class="parametername">parameters</span></td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| <h5 class="exceptions">Exceptions</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Condition</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.InvalidOperationException</span></td> |
| <td><p>if you create a second instance of the same |
| <code data-dev-comment-type="paramref" class="paramref">baseClass</code> and method declaration combination. This enforces the singleton status. </p> |
| </td> |
| </tr> |
| <tr> |
| <td><span class="xref">System.ArgumentException</span></td> |
| <td><p>If <code data-dev-comment-type="paramref" class="paramref">baseClass</code> does not declare the given method. </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <h3 id="methods">Methods |
| </h3> |
| <span class="small pull-right mobile-hide"> |
| <span class="divider">|</span> |
| <a href="https://github.com/apache/lucenenet/new/docs/4.8.0-beta00013/websites/apidocs/apiSpec/new?filename=Lucene_Net_Util_VirtualMethod_CompareImplementationDistance_System_Type_Lucene_Net_Util_VirtualMethod_Lucene_Net_Util_VirtualMethod_.md&value=---%0Auid%3A%20Lucene.Net.Util.VirtualMethod.CompareImplementationDistance(System.Type%2CLucene.Net.Util.VirtualMethod%2CLucene.Net.Util.VirtualMethod)%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a> |
| </span> |
| <span class="small pull-right mobile-hide"> |
| <a href="https://github.com/NightOwl888/lucenenet/blob/fix/apidocs-layout/src/Lucene.Net/Util/VirtualMethod.cs/#L203">View Source</a> |
| </span> |
| <a id="Lucene_Net_Util_VirtualMethod_CompareImplementationDistance_" data-uid="Lucene.Net.Util.VirtualMethod.CompareImplementationDistance*"></a> |
| <h4 id="Lucene_Net_Util_VirtualMethod_CompareImplementationDistance_System_Type_Lucene_Net_Util_VirtualMethod_Lucene_Net_Util_VirtualMethod_" data-uid="Lucene.Net.Util.VirtualMethod.CompareImplementationDistance(System.Type,Lucene.Net.Util.VirtualMethod,Lucene.Net.Util.VirtualMethod)">CompareImplementationDistance(Type, VirtualMethod, VirtualMethod)</h4> |
| <div class="markdown level1 summary"><p>Utility method that compares the implementation/override distance of two methods. </p> |
| </div> |
| <div class="markdown level1 conceptual"></div> |
| <h5 class="decalaration">Declaration</h5> |
| <div class="codewrapper"> |
| <pre><code class="lang-csharp hljs">public static int CompareImplementationDistance(Type clazz, VirtualMethod m1, VirtualMethod m2)</code></pre> |
| </div> |
| <h5 class="parameters">Parameters</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Name</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Type</span></td> |
| <td><span class="parametername">clazz</span></td> |
| <td></td> |
| </tr> |
| <tr> |
| <td><a class="xref" href="Lucene.Net.Util.VirtualMethod.html">VirtualMethod</a></td> |
| <td><span class="parametername">m1</span></td> |
| <td></td> |
| </tr> |
| <tr> |
| <td><a class="xref" href="Lucene.Net.Util.VirtualMethod.html">VirtualMethod</a></td> |
| <td><span class="parametername">m2</span></td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| <h5 class="returns">Returns</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Int32</span></td> |
| <td><ul><li>> 1, iff <code data-dev-comment-type="paramref" class="paramref">m1</code> is overridden/implemented in a subclass of the class overriding/declaring <code data-dev-comment-type="paramref" class="paramref">m2</code></li><li>< 1, iff <code data-dev-comment-type="paramref" class="paramref">m2</code> is overridden in a subclass of the class overriding/declaring <code data-dev-comment-type="paramref" class="paramref">m1</code></li><li>0, iff both methods are overridden in the same class (or are not overridden at all)</li></ul> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <span class="small pull-right mobile-hide"> |
| <span class="divider">|</span> |
| <a href="https://github.com/apache/lucenenet/new/docs/4.8.0-beta00013/websites/apidocs/apiSpec/new?filename=Lucene_Net_Util_VirtualMethod_GetImplementationDistance_System_Type_.md&value=---%0Auid%3A%20Lucene.Net.Util.VirtualMethod.GetImplementationDistance(System.Type)%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a> |
| </span> |
| <span class="small pull-right mobile-hide"> |
| <a href="https://github.com/NightOwl888/lucenenet/blob/fix/apidocs-layout/src/Lucene.Net/Util/VirtualMethod.cs/#L147">View Source</a> |
| </span> |
| <a id="Lucene_Net_Util_VirtualMethod_GetImplementationDistance_" data-uid="Lucene.Net.Util.VirtualMethod.GetImplementationDistance*"></a> |
| <h4 id="Lucene_Net_Util_VirtualMethod_GetImplementationDistance_System_Type_" data-uid="Lucene.Net.Util.VirtualMethod.GetImplementationDistance(System.Type)">GetImplementationDistance(Type)</h4> |
| <div class="markdown level1 summary"><p>Returns the distance from the <code>baseClass</code> in which this method is overridden/implemented |
| in the inheritance path between <code>baseClass</code> and the given subclass <code data-dev-comment-type="paramref" class="paramref">subclazz</code>. </p> |
| </div> |
| <div class="markdown level1 conceptual"></div> |
| <h5 class="decalaration">Declaration</h5> |
| <div class="codewrapper"> |
| <pre><code class="lang-csharp hljs">public int GetImplementationDistance(Type subclazz)</code></pre> |
| </div> |
| <h5 class="parameters">Parameters</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Name</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Type</span></td> |
| <td><span class="parametername">subclazz</span></td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| <h5 class="returns">Returns</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Int32</span></td> |
| <td><p>0 if and only if not overridden, else the distance to the base class. </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <span class="small pull-right mobile-hide"> |
| <span class="divider">|</span> |
| <a href="https://github.com/apache/lucenenet/new/docs/4.8.0-beta00013/websites/apidocs/apiSpec/new?filename=Lucene_Net_Util_VirtualMethod_IsOverriddenAsOf_System_Type_.md&value=---%0Auid%3A%20Lucene.Net.Util.VirtualMethod.IsOverriddenAsOf(System.Type)%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Improve this Doc</a> |
| </span> |
| <span class="small pull-right mobile-hide"> |
| <a href="https://github.com/NightOwl888/lucenenet/blob/fix/apidocs-layout/src/Lucene.Net/Util/VirtualMethod.cs/#L159">View Source</a> |
| </span> |
| <a id="Lucene_Net_Util_VirtualMethod_IsOverriddenAsOf_" data-uid="Lucene.Net.Util.VirtualMethod.IsOverriddenAsOf*"></a> |
| <h4 id="Lucene_Net_Util_VirtualMethod_IsOverriddenAsOf_System_Type_" data-uid="Lucene.Net.Util.VirtualMethod.IsOverriddenAsOf(System.Type)">IsOverriddenAsOf(Type)</h4> |
| <div class="markdown level1 summary"><p>Returns, if this method is overridden/implemented in the inheritance path between |
| <code>baseClass</code> and the given subclass <code data-dev-comment-type="paramref" class="paramref">subclazz</code>. |
| <p>You can use this method to detect if a method that should normally be final was overridden |
| by the given instance's class. </p> |
| </div> |
| <div class="markdown level1 conceptual"></div> |
| <h5 class="decalaration">Declaration</h5> |
| <div class="codewrapper"> |
| <pre><code class="lang-csharp hljs">public bool IsOverriddenAsOf(Type subclazz)</code></pre> |
| </div> |
| <h5 class="parameters">Parameters</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Name</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Type</span></td> |
| <td><span class="parametername">subclazz</span></td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| <h5 class="returns">Returns</h5> |
| <table class="table table-bordered table-striped table-condensed"> |
| <thead> |
| <tr> |
| <th>Type</th> |
| <th>Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span class="xref">System.Boolean</span></td> |
| <td><p><code>false</code> if and only if not overridden. </p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </article> |
| </div> |
| |
| <div class="hidden-sm col-md-2" role="complementary"> |
| <div class="sideaffix"> |
| <div class="contribution"> |
| <ul class="nav"> |
| <li> |
| <a href="https://github.com/apache/lucenenet/new/docs/4.8.0-beta00013/websites/apidocs/apiSpec/new?filename=Lucene_Net_Util_VirtualMethod.md&value=---%0Auid%3A%20Lucene.Net.Util.VirtualMethod%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A" class="contribution-link">Improve this Doc</a> |
| </li> |
| <li> |
| <a href="https://github.com/apache/lucenenet/blob/fix/apidocs-layout/src/Lucene.Net/Util/VirtualMethod.cs/#L67" class="contribution-link">View Source</a> |
| </li> |
| </ul> |
| </div> |
| <nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix"> |
| <!-- <p><a class="back-to-top" href="#top">Back to top</a><p> --> |
| </nav> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <footer> |
| <div class="grad-bottom"></div> |
| <div class="footer"> |
| <div class="container"> |
| <span class="pull-right"> |
| <a href="#top">Back to top</a> |
| </span> |
| Copyright © 2020 The Apache Software Foundation, Licensed under the <a href='http://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache License, Version 2.0</a><br> <small>Apache Lucene.Net, Lucene.Net, Apache, the Apache feather logo, and the Apache Lucene.Net project logo are trademarks of The Apache Software Foundation. <br>All other marks mentioned may be trademarks or registered trademarks of their respective owners.</small> |
| |
| </div> |
| </div> |
| </footer> |
| </div> |
| |
| <script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.vendor.js"></script> |
| <script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.js"></script> |
| <script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/main.js"></script> |
| </body> |
| </html> |