CSharp · Console
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;
}