我正在创建一系列包含基本属性的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中获得可修改的继承,因为我可能希望某些内容可以修改但不能删除。这些特定的课程不是我的问题,我只是用它们来说明我的问题。
是否存在通过允许函数体模仿抽象类的设计模式,但允许多个继承者如接口?
答案 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)
是的,实际上有几种方法。一些想法:
Deletable
,Modifiable
等使用空接口(称为标记接口),然后为它们创建扩展方法。这不像多重继承那样可扩展,但它有很长的路要走。显然,以上都没有多重继承的所有优点。如果要在.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#中无法进行多重继承,这对您来说太无聊了。您的选择是:
它不漂亮,但您也可以通过检查实例类型来控制属性可访问性或返回类中的值。
答案 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
}