【问题标题】:Interfacing with an Abstract Class of Different Derived Class与不同派生类的抽象类接口
【发布时间】:2015-05-13 12:18:53
【问题描述】:

我有四个类和一个接口,如下所示:

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(),但它需要在SourceB 中使用DesiredFunc() 的实现。

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

public class SourceBChild : SourceB, ISource
{
    DesiredFunc()
     {
          base.DesiredFunc();
     }
}

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

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

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

提前感谢您的帮助。

【问题讨论】:

  • 也许你可以考虑实现一个装饰器模式?
  • SourceB 是您创建的,还是来自与 SourceA 相同的库?
  • 好吧,没有创建SourceB。尽管有人建议我尽可能不要这样做,但这是可以修改的。

标签: c# .net inheritance abstract-class


【解决方案1】:

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

如果SourceB 中的DesiredFuncpublic,则您的包装类可以简化为:

public class SourceBChild : SourceB
{
}

DesiredFunc 方法随后将自动公开。但是,如果它是 protected,则需要像以前一样包装它。

你的 cmets 的最后一行对我来说没有多大意义 - 你提到了数据完整性和属性,但是由于 SourceBDesiredFuncSourceBChild 的实例上运行,它不能使用这些字段或 SourceA 实例的属性。

【讨论】:

  • DesiredFunc 受到保护,所以我想我被卡住了。我所说的数据完整性是指这个DesiredFunc 工作在一个深埋在父Source 类中的属性上,该类向用户显示一些信息。我担心的是,当SourceB 调用该函数时,显示给用户的内容可能不一定与SourceAChild 中存储的内容一致。
猜你喜欢
  • 2012-03-14
  • 2016-03-24
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多