blob: 8be94bbc8a33cac1e506e854dd7ba0bf42ce5c19 [file] [log] [blame]
<!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), &quot;newName&quot;, parameters...);
internal static readonly VirtualMethod oldMethod =
new VirtualMethod(typeof(BaseClass), &quot;oldName&quot;, 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&apos;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&amp;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&amp;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>&gt; 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>&lt; 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&amp;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&amp;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&apos;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&amp;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>