2010-06-08 49 views
4

好吧,我正在推翻这一点。有没有一种方法可以组合接口和属性,以便实现类中的属性属性满足接口合同?使用属性来满足界面要求

在我的应用程序中,我想展示一系列活动,这些活动是系统中的事件聚合,例如新消息,正在创建/分配/更新的新任务等。它只是一个快速的手发生了什么事情的清单。

我想过使用IIsActivity接口来标记需要成为该聚合的一部分的实体。我只需要显示活动标题,发生日期以及链接到应用程序中的相关区域。我不想在继承类中执行额外的属性,但它们只是最终重复信息。例如,任务具有AssignedOn(DateTime),并且消息具有CreatedOn(DateTime)。这两个都将满足要求被视为活动的日期要求。我不想要的是仅针对活动日期的单独属性。同样的事情可以去标题(消息有一个标题属性,任务有一个名称属性)。因此,我基本上希望能够说:“给我任何东西,这是一个IIsActivity。在每个实现者中,我希望有一个标记了ActivityTitle属性的属性,以及一个具有ActivityDate属性的属性。 “

太多了?

回答

1

我认为你最好的方法是使用明确的接口实现。

public interface IActivity 
{ 
    DateTime OccurredOn { get; } 
} 

public class Task : IActivity 
{ 
    public DateTime AssignedOn 
    { 
    get { /* implemenation */ } 
    } 

    DateTime IActivity.OccurredOn 
    { 
    get { return AssignedOn; } 
    } 
} 

public class Message : IActivity 
{ 
    public DateTime CreatedOn 
    { 
    get { /* implemenation */ } 
    } 

    DateTime IActivity.OccurredOn 
    { 
    get { return CreatedOn; } 
    } 
} 

然后你可以使用你的类像这样:

public static void Main() 
{ 
    Task task = new Task(); 
    Console.WriteLine(task.AssignedOn); // OK 
    Console.WriteLine(task.OccurredOn); // Compile Error 
    IActivity activity = task as IActivity; 
    if (activity != null) 
    { 
    Console.WriteLine(activity.AssignedOn); // Compile Error 
    Console.WriteLine(activity.OccurredOn); // OK 
    } 
} 
0

这不正是你的设计,但我已经使用属性来执行一些我的课的性质有一个理想值。我耗费了web服务,我要发一些信息,一些字段的要求进行价值,别人不...

[Serializable] 
    [AttributeUsage(AttributeTargets.Property)] 
    public class RequiredAttribute : Attribute 
    { 
     private CheckType[] _requiredtype; 
     public RequiredAttribute(params CheckType[] type) 
     { 
      _requiredtype = type; 
     } 
     public CheckType[] Requires 
     { 
      get { return _requiredtype; } 
     } 
     public static bool CheckRequirements(object applyto, out string errormessages) 
     { ... } 

     private static bool RequiredSucceeded(object applyto, StringBuilder resultmessage) 
     { ... } 
    } 
    [Serializable] 
    public enum CheckType 
    { 
     HasValue,  // Checks that the property value is not null 
     CheckMinRequirements, // Will enforce the validation of properties on defined types 
     IsNotNullorEmpty, // For strings 
     HasElements, // Elements exist on arrays 
     ElementsRequirements // for collections 
    } 

现在有使用属性

[Serializable] 
    public class PurchaseInsurance 
    { 
     [Required(CheckType.IsNotNullorEmpty)] 
     public string PartnerBookingID 
     { 
      get; 
      set; 
     } 
     [Required(CheckType.IsNotNullorEmpty)] 
     public string Currency 
     { 
      get; 
      set; 
     } 
     public string ReferringURL; 

     [Required(CheckType.HasValue, CheckType.CheckMinRequirements)] 
     public PurchaserInfo Purchaser 
     { 
      get; 
      set; 
     } 
     [Required(CheckType.HasValue, CheckType.ElementsRequirements)] 
     public InsuranceProduct[] Products 
     { 
      get; 
      set; 
     } 
... 
} 
一个类的实例

在将数据发送到webService之前,我将检查每个属性是否符合它们的属性标记。

0

虽然CLR支持它,但C#不支持接口实现别名。你可以在VB.NET实现它,但:

Public Interface IActivity ' this can even be in C# ' 
    ReadOnly Property OccurredOn() As DateTime 
End Interface 

Public Class Task 
    Implements IActivity 

    Public ReadOnly Property AssignedOn() As DateTime Implements IActivity.OccurredOn 
    Get 
     ' implementation... ' 
    End Get 
    End Property 

End Class 

Public Class Message 
    Implements IActivity 

    Public ReadOnly Property CreatedOn() As DateTime Implements IActivity.OccurredOn 
    Get 
     ' implementation... ' 
    End Get 
    End Property 

End Class 

所以,由Brian Gideon提到,显式接口实现是什么来在C#更接近你的目标。

相关问题