接口介紹一些關於一類關係,但不一定定義它。正如其他人所說,這更多的是一種Can-Do關係。你可以做些什麼/以及這個類,等等。
有一個關係將是一個類,它利用其他類來代表0 .. *關係的東西。
// This interface doesn't really define what a class is, only
// that it can, in fact, have Cheeseburgers.
public interface ICanHasCheeseburgers
{
List<Cheeseburger> Cheeseburgers { get; }
}
// This abstract class, defines what a derived class 'is'.
// If you are familiar with biology, imagine: kingdom, phylum, class, order,
// genius, species. It's different levels of abstraction for a 'thing'.
public abstract class Animal
{
}
// The cat class derives from the Animal class just as a Dog class might.
// This is a Is-A relationship; the Cat is an Animal. It also implements
// the ICanHasCheeseburgers interface which represents a Can-Do relationship.
public class Cat : Animal, ICanHasCheeseburgers
{
// this property represents a Has-A relationship between our Cat
// class and a Cheeseburger class. The cat can have any number of
// Cheeseburger objects.
public List<Cheeseburger> Cheeseburgers { get; private set; }
public Cat(RandomNumberGenerator generator)
{
if (generator != null)
{
var number = generator.GetRandom();
var burgers = new List<Cheeseburger>();
while(number > 0) {
burgers.add(new Cheeseburger());
number--;
}
Cheeseburgers = burgers;
}
}
}
Can-Do和Is-A關係允許我們抽象邏輯。假設我們有任何數量的Animals
,我們想知道他們有多少Cheeseburgers
在一起。如果我們必須爲每隻動物編寫一種方法,然後嘗試將它們加在一起,這將不會很有趣。但是抽象一下,我們可以寫出一種方法。
public static class Util
{
public int GetTotalCheeseburgerCount(List<Animal> animals)
{
var total = 0;
foreach(var animal in animals)
{
// not every animal can have cheeseburgers, so we
// can ignore this animal if it can't.
var canHasCheeseburger = animal as ICanHasCheeseburger;
if (canHasCheeseburger != null)
{
if (canHasCheeseburger.Cheeseburgers != null)
{
total += canHasCheeseburger.Cheeseburgers.Count;
}
}
}
return total;
}
}
可能重複的[C#接口實現關係只是「可以做」的關係?](http://stackoverflow.com/questions/255644/c-sharp-interface-implementation-relationship-is-just -can-do-relationship) – Habib
接口是CAN-DO關係。這不是一個IS-A也不是一個HAS-A –
我不清楚前兩段是如何得出這個問題的。如果該功能是「靜態」,則可以在沒有實例的情況下在類上引用功能,但這與繼承或接口抽象無關。 – David