.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
	public static void Main()
	{
		var list = new List<Tile>
		{
			new DragonTile(), 
			new SuitedTile(), 
			new WindTile(), 
		};
		
		var ordered = list.OrderBy(x => x);
		
		foreach (var tile in ordered)
			Console.WriteLine(tile.GetType().Name);
	}
}

abstract class Tile : IComparable<Tile>, IComparable<SuitedTile>, IComparable<WindTile>, IComparable<DragonTile>
{
	public abstract int CompareTo(Tile other);
	public abstract int CompareTo(WindTile other);
	public abstract int CompareTo(SuitedTile other);
	public abstract int CompareTo(DragonTile other);
}

class SuitedTile : Tile
{
	public override int CompareTo(Tile other) => other.CompareTo(this);
	public override int CompareTo(SuitedTile other) => 0;
	public override int CompareTo(WindTile other) => 1;
	public override int CompareTo(DragonTile other)=> 1;
}

abstract class HonorTile : Tile
{
}

class WindTile : HonorTile
{
	public override int CompareTo(Tile other) => other.CompareTo(this);
	public override int CompareTo(SuitedTile other) => -1;
	public override int CompareTo(WindTile other) => 0;
	public override int CompareTo(DragonTile other) => 1;
}

class DragonTile : HonorTile
{
	public override int CompareTo(Tile other) => other.CompareTo(this);
	public override int CompareTo(SuitedTile other) => -1;
	public override int CompareTo(WindTile other) => -1;
	public override int CompareTo(DragonTile other) => 0;
}
;