C#:具有非抽象计算属性的多重继承

时间:2011-03-04 20:24:11

标签: c# inheritance abstract-class

我正在创建一系列包含基本属性的Interfaces / Abstract类,我希望计算出属性和多重继承。

public abstract class /interface Modifiable
{
   public DateTime ModifiedDate {get; set;}

   public boo ModifiedToday
   {
     get { return DateTime.Now.AddDays(-1).CompareTo(ModifiedDate) >= 0; }
   } 

   public bool ModifiedInLastWeek
   {
     get { return DateTime.Now.AddDays(-7).CompareTo(ModifiedDate) >= 0; }
   }
}

public abstract class /interface Deletable
{
   public DateTime DeletionDate {get; set;}    

   public bool Deleted
   {
     get { return DeletionDate != default(DateTime) }
   }
}

然后我有一个继承自这两个Interfaces / Abstract类的类。

public class Something : Modifiable, Deletable 
{
  //
}

但是一个类不能从两个抽象类继承。所以我需要使用接口,但是使用接口我不能拥有方法体。然后,我必须在多个类中定义相同的确切函数,以使用接口实现这些简单的bool属性。

我也不想从Deletable中获得可修改的继承,因为我可能希望某些内容可以修改但不能删除。这些特定的课程不是我的问题,我只是用它们来说明我的问题。

是否存在通过允许函数体模仿抽象类的设计模式,但允许多个继承者如接口?

7 个答案:

答案 0 :(得分:1)

没有。 C#没有以这种方式实现多重继承的机制。

说到接口,这是可能的,因为当您定义多个接口时,您还需要全部实现它们。

考虑一种不同的设计,可能使用组合来重用您想要用于多重继承的类。

答案 1 :(得分:1)

这不是多重继承,但我想到的是扩展方法。

public interface IModifiable
{
    DateTime ModifiedDate {get; set;}
}

public static class ModifiableExtensions
{
   public bool ModifiedToday(this IModifiable m)
   {
      return DateTime.Now.AddDays(-1).CompareTo(m.ModifiedDate) >= 0;
   } 

   public bool ModifiedInLastWeek(this IModifiable m)
   {
     return DateTime.Now.AddDays(-7).CompareTo(m.ModifiedDate) >= 0; 
   }

}

这给出了在类型中烘焙的辅助方法的“感觉”,但它们碰巧在其他地方声明。上这堂课:

public class MyModifiable :IModifiable
{
     public ModifiedDate {get; set;}
}

你可以这样做:

MyModifiable m = new MyModifiable;

m.ModifiedDate = DateTime.Now;

bool isToday = m.ModifiedToday();

答案 2 :(得分:1)

是的,实际上有几种方法。一些想法:

  • DeletableModifiable等使用空接口(称为标记接口),然后为它们创建扩展方法。这不像多重继承那样可扩展,但它有很长的路要走。
  • 使用通用性,可能使用相同的标记接口来创建依赖项。这样,您就可以拥有一个基类,其中包含可修改和可删除的所有方法,包括派生类中的抽象方法和覆盖实现
  • 使用面向方面的编程来获得相同的结果
  • 几乎相同,但可以使用Castle或类似的库自己动手,可能是在属性的帮助下。

显然,以上都没有多重继承的所有优点。如果要在.NET中进行多重继承,可以使用C ++。NET或Eiffel.NET。

答案 3 :(得分:1)

我忘记了设计模式名称,但是通过在同一接口的成员的接口实现周围包装方法/属性调用,有一种实现多个接口的模式:

interface IDrivable {
  void Drive();
}

interface IFlyable {
  void Fly();
}

class Car : IDrivable {
  public void Drive() { /* Implementation */ }
}

class Plane : IFlyable {
  public void Fly() { /* Implementation */ }
}

class MyClass : IDrivable, IFlyable {
  private IDrivable _car = new Car();
  private IFlyable _plane = new Plane();

  public void Drive() { _car.Drive(); }
  public void Fly() { _plane.Fly(); }
}

答案 4 :(得分:0)

很抱歉,在C#中无法进行多重继承,这对您来说太无聊了。您的选择是:

  1. 要么将基类继承链接到MyClass:MyBaseClass:EvenBasierClass
  2. 或从多个接口继承。并实现所有接口的所有方法。
  3. 它不漂亮,但您也可以通过检查实例类型来控制属性可访问性或返回类中的值。

答案 5 :(得分:0)

可修改&可删除的IMO应该是接口,而不是基类。基类定义类型是什么,而接口描述类型的作用。

就实现代码而言,您始终可以使用扩展方法:

public interface IModifiable
{
   public DateTime ModifiedDate {get; set;}
}

public interface IDeletable
{
   public DateTime DeletionDate {get; set;}    
}


public static class SomeExtentions
{
    public static bool IsModifiedToday(this IModifiable modifiable)
    {
        return DateTime.Now.AddDays(-1).CompareTo(modifiable.ModifiedDate) >= 0;
    } 

    public static bool IsModifiedInLastWeek(this IModifiable modifiable)
    {
        return DateTime.Now.AddDays(-7).CompareTo(modifiable.ModifiedDate) >= 0;
    }   
    public static bool IsDeleted(this IDeletable deletable)
    {
        return deletable.DeletionDate != default(DateTime);
    }
}

答案 6 :(得分:0)

我可能会使用委托来实现这一目标。创建可修改和可删除的接口,然后创建它们的实现。提供这些实现的Something类实例。以下是可删除的示例:

public interface Deletable
{
  DateTime DeletionDate{get;set;}
  bool Deleted{get;}
}

public class DeletableImpl : Deletable
{
  public DateTime DeletionDate{get; set;}
  public bool Deleted{get {return DeletionDate != default(DateTime);}}
}
// Do the same thing with Modifiable and ModifiableImpl

public class Something : Deletable, Modifiable
{
  private Deletable _deletable = new DeletableImpl();
  private Modifiable _modifiable = new ModifiableImpl();
  public DateTime DeletionDate
  {
    get{return _deletable.DeletionDate;}
    set{_deletable.DeletionDate = value;}
  }
  public bool Deleted{get{return _deletable.Deleted;}}
  public DateTime ModifiedDate {
    // and so on as above
}