返回 C # :
因为 C # 基本上是一种静态类型语言,类型接口的“位置”应该是协变或逆变的(例如参数和返回类型) ,必须明确标记,以保证该类型的一致使用/开发,使 LSP 工作良好。在动态类型语言中,LSP 一致性通常不是问题,换句话说,您可以完全摆脱协变和逆变的“标记”。如果仅在类型中使用类型动态,则使用 Net 接口和委托。但是这不是 C # 中最好的解决方案(你不应该在公共接口中使用动态)。
delegate TOutput Converter<in TInput, out TOutput>(TInput input);
TOutput表示方法返回 更具体的类型的 协方差。
TInput表示向其传递方法 不那么具体的类型的 违规行为。
public class Dog { public string Name { get; set; } }
public class Poodle : Dog { public void DoBackflip(){ System.Console.WriteLine("2nd smartest breed - woof!"); } }
public static Poodle ConvertDogToPoodle(Dog dog)
{
return new Poodle() { Name = dog.Name };
}
List<Dog> dogs = new List<Dog>() { new Dog { Name = "Truffles" }, new Dog { Name = "Fuzzball" } };
List<Poodle> poodles = dogs.ConvertAll(new Converter<Dog, Poodle>(ConvertDogToPoodle));
poodles[0].DoBackflip();
class Flower { }
class Rose: Flower { }
class Daisy: Flower { }
interface FlowerShop<out T> where T: Flower {
T getFlower();
}
class RoseShop: FlowerShop<Rose> {
public Rose getFlower() {
return new Rose();
}
}
class DaisyShop: FlowerShop<Daisy> {
public Daisy getFlower() {
return new Daisy();
}
}
问题是“花店在哪里?”,答案是“玫瑰花店在那里”:
static FlowerShop<Flower> tellMeShopAddress() {
return new RoseShop();
}