Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here is the same thing as Enigmativity’s answer, but with all the redundant constraints removed. This still compiles, it doesn’t have any generic recursion in it, and as far as I can tell is still as type-safe as was required. Enigmativity, what am I missing? :)</p> <pre><code>public class Generic_Element { } public class Generic_Visit&lt;E&gt; { public E Element { get; set; } } /// &lt;summary&gt;Collection of Visits&lt;/summary&gt; public class Generic_Route&lt;V&gt; { public List&lt;V&gt; Visits { get; set; } public Double Distance { get; set; } } /// &lt;summary&gt;Collection of Routes&lt;/summary&gt; public class Generic_Solution&lt;R, V&gt; where R : Generic_Route&lt;V&gt; { public List&lt;R&gt; Routes { get; set; } public Double Distance { get { return this.Routes.Select(r =&gt; r.Distance).Sum(); } } } public class Generic_Tsp_Element : Generic_Element { } /// &lt;summary&gt;Visit to a Generic_Element&lt;/summary&gt; public class Generic_Tsp_Visit&lt;E&gt; : Generic_Visit&lt;E&gt; { public Double Time { get; set; } } /// &lt;summary&gt;Collection of Visits&lt;/summary&gt; public class Generic_Tsp_Route&lt;V, E&gt; : Generic_Route&lt;V&gt; where V : Generic_Tsp_Visit&lt;E&gt; { public Double Time { get { return this.Visits.Select(v =&gt; v.Time).Sum(); } } } /// &lt;summary&gt;Collection of Routes&lt;/summary&gt; public class Generic_Tsp_Solution&lt;R, V, E&gt; : Generic_Solution&lt;R, V&gt; where R : Generic_Tsp_Route&lt;V, E&gt; where V : Generic_Tsp_Visit&lt;E&gt; { public Double Time { get { return this.Routes.Select(r =&gt; r.Time).Sum(); } } } public class Concrete_Tsp_Element : Generic_Tsp_Element { } public class Concrete_Tsp_Visit : Generic_Tsp_Visit&lt;Concrete_Tsp_Element&gt; { } public class Concrete_Tsp_Route : Generic_Tsp_Route&lt;Concrete_Tsp_Visit, Concrete_Tsp_Element&gt; { } public class Concrete_Tsp_Solution : Generic_Tsp_Solution&lt;Concrete_Tsp_Route, Concrete_Tsp_Visit, Concrete_Tsp_Element&gt; { } public class Generic_Vrp_Element : Generic_Element { } /// &lt;summary&gt;Visit to a Generic_Element&lt;/summary&gt; public class Generic_Vrp_Visit&lt;V, E&gt; : Generic_Visit&lt;E&gt; { public Double Capacity { get; set; } } /// &lt;summary&gt;Collection of Visits&lt;/summary&gt; public class Generic_Vrp_Route&lt;R, V, E&gt; : Generic_Route&lt;V&gt; where V : Generic_Vrp_Visit&lt;V, E&gt; { public Double Capacity { get { return this.Visits.Select(v =&gt; v.Capacity).Sum(); } } } /// &lt;summary&gt;Collection of Routes&lt;/summary&gt; public class Generic_Vrp_Solution&lt;S, R, V, E&gt; : Generic_Solution&lt;R, V&gt; where R : Generic_Vrp_Route&lt;R, V, E&gt; where V : Generic_Vrp_Visit&lt;V, E&gt; { public Double Capacity { get { return this.Routes.Select(r =&gt; r.Capacity).Sum(); } } } public class Concrete_Vrp_Element : Generic_Vrp_Element { } public class Concrete_Vrp_Visit : Generic_Vrp_Visit&lt;Concrete_Vrp_Visit, Concrete_Vrp_Element&gt; { } public class Concrete_Vrp_Route : Generic_Vrp_Route&lt;Concrete_Vrp_Route, Concrete_Vrp_Visit, Concrete_Vrp_Element&gt; { } public class Concrete_Vrp_Solution : Generic_Vrp_Solution&lt;Concrete_Vrp_Solution, Concrete_Vrp_Route, Concrete_Vrp_Visit, Concrete_Vrp_Element&gt; { } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload