我想要明確我對前述原則的理解,並通過閱讀wikipedia條目來完成此操作。瞭解Liskov替代原理
除了仍然給我悲傷的協變和逆變的概念外,維基百科還提到超類型的不變式必須保留在子類型和歷史約束或歷史規則中。基於這些最後兩個概念,我想出了這個小例子:
class Program
{
static void Main(string[] args)
{
var fooUser = new FooUser();
var fooBase = new FooBase("Serge");
var fooDerived = new FooDerived("Serge");
fooUser.Use(fooBase); //will print "Serge"
fooUser.Use(fooDerived); //will print "New User"
Console.ReadKey();
}
}
public class FooUser
{
public void Use(IFoo foo)
{
foo.DoSomething();
Console.WriteLine(foo.Name);
}
}
public interface IFoo
{
string Name { get; }
void DoSomething();
}
public class FooBase : IFoo
{
public string Name { get; protected set; }
public FooBase(string name)
{
Name = name;
}
public virtual void DoSomething()
{
}
}
public class FooDerived : FooBase
{
public FooDerived(string name) : base(name)
{
}
public override void DoSomething()
{
Name = "New Name";
base.DoSomething();
}
}
所以我的問題是:基於上述兩個概念,我是不是違反原則與這個例子嗎?如果不是,爲什麼?
非常感謝您提前。
你的解釋提供了一個很好的觀點 – vibhu 2014-01-03 18:30:51