這可以通過一個例子更好地解釋。目前,我有這樣的事情:如何強制執行接口方法中的特定值?
public class Car {
internal string SaleCode {get; set;} //Spring, Summer, ...
public string Name {get; set; } //Model name
}
public interface ICarFactory
{
Car GetSummerSaleCar();
Car GetSpringSaleCar();
}
public class FordFactory : ICarFactory
{
public Car GetSummerSaleCar() {
return new Car() {Name="Fiesta"};
}
public Car GetSpringSaleCar() {
return new Car() {Name="Fusion"};
}
}
public class CarProvider {
public void ProduceCars(ICarFactory factory) {
var inventory = new List<Car>();
Car car = null;
car = factory.GetSummerSaleCar();
car.SaleCode = "SMR";
inventory.Add(car);
car = factory.GetSpringSaleCar();
car.SaleCode = "SPG";
inventory.Add(car);
}
}
汽車的SaleCode應該始終爲每個方法是相同的,所以CarFactory實現不應設置此值。現在我在CarProvider類中設置了它,但是我想知道是否有辦法從接口中獲取它。我能想到的唯一的事情就是使用一個屬性應用於我可以設置類型的接口內部的方法定義,但我覺得必須有另一種選擇。
想法?
UPDATE
在你想知道的情況下,這就是我說的是,當我提到添加屬性接口中的每個方法:
public class SaleAttribute : Attribute
{
public string Code { get; set; }
}
public interface ICarFactory
{
[Sale(Code = "SMR")]
Car GetSummerSaleCar();
[Sale(Code = "SPG")]
Car GetSpringSaleCar();
}
public void ProduceCars(ICarFactory factory)
{
var inventory = new List<Car>();
foreach (var method in typeof(ICarFactory).GetMethods())
{
String carType = null;
var attributes = method.GetCustomAttributes(typeof(SaleAttribute), false);
if (attributes.Length == 1)
{
saleCode = ((SaleAttribute)attributes[0]).Name;
Car car = (Car)method.Invoke(factory, null);
car.SaleCode = saleCode;
inventory.Add(car);
}
}
}
這有額外的好處如果在界面中添加了一個方法,CarProvider不需要修改。顯然缺點是與Reflection相關的開銷(性能和維護)。
UPDATE2
我使用汽車類型銷售代碼,因爲這更能體現我的情況發生變化的例子。
如何實現接口並設置汽車類型的抽象基類? –
爲什麼在創建Car對象期間無法設置Type的任何特定原因? –
您可以自動設置Car類中的值,也可以使用抽象類而不是接口。您的FordFactory也不實現ICarFactory。 – MrFox