与不同派生类的抽象类接口

时间:2015-03-11 15:47:17

标签: c# .net inheritance abstract-class

我有四个类和一个界面,如下所示:

public interface ISource
{
     DesiredFunc();
}

public class Source
{

}

public class SourceA : Source
{

}

public class SourceAChild : SourceA, ISource
{
     DesiredFunc()
     {
     }
}

public abstract class SourceB : Source, ISource
{
     DesiredFunc()
     {
     }
}

SourceSourceA来自图书馆,所以我无法改变其实施方式。有SourceAChild个对象调用DesiredFunc(),但需要在DesiredFunc()中使用SourceB的实现。

到目前为止,我所做的是创建一个SourceB的包装类。我在SourceAChild内创建该类的实例,然后调用基本方法。像

这样的东西
public class SourceBChild : SourceB, ISource
{
    DesiredFunc()
     {
          base.DesiredFunc();
     }
}

public class SourceAChild : SourceA, ISource
{
    SourceBChild srcB = new SourceBChild();

     DesiredFunc()
     {
         srcB.DesiredFunc();
     }
}

这对我来说似乎很难看。有没有更好的方法来SourceB's实施DesiredFunc()?我目前使用的解决方法可以看到的最大问题之一是SourceAChildSourceBChild之间的数据完整性,因为前一类经常更新其属性。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要调用抽象类的非静态方法,您总是需要一个类实例,因此您必须将其子类化。

如果DesiredFunc的{​​{1}}为SourceB,您的包装类可以简化为:

public

然后会自动公开public class SourceBChild : SourceB { } 方法。但是如果它是DesiredFunc,你需要像现在一样包装它。

您的评论的最后一行对我没有多大意义 - 您提到了数据完整性和属性,但由于protected的{​​{1}}在DesiredFunc的实例上运行,因此无法使用SourceB实例的字段或属性。