我有两个实现ISomeBehavior的类。现在我希望他们分享功能。通常我会用一个抽象类替换ISomeBehavior,比如SomeBehaviorBase。问题是其中一个子类已经从另一个类派生,而另一个类不是我们拥有的软件。 (这是C#,因此多重继承不是一种选择。)从第三方类派生的子类没有实现。它只是派生自第三方类,并实现了ISomeBehavior,因此第三方类的处理方式与实现ISomeBehavior的其他子类相同。
目前我所做的是在ISomeBehavior上实现扩展方法。现在消费代码可以调用该方法。这种方法的问题是我想强制调用代码使用这个扩展方法。我无法从界面中删除SomeMethod(),因为扩展方法最终必须调用它。
关于如何让两个类优雅地分享相同的行为的任何想法,当其中一个已经派生自另一个,第三方,类?注意:策略设计模式听起来像是有意义的,但是当子类之间的行为变化时使用该模式。这里的行为没有变化;它只需要分享。
答案 0 :(得分:5)
有什么理由不能使用合成而不是委托来实现当前派生自第三方类的类?只需将所有接口方法委托给第三方类的实例。这样,如果您想添加功能,可以使用公共基类。
在对象标识相关的某些情况下,这不起作用,但在许多情况下,这是一个非常合理的设计。
答案 1 :(得分:2)
这是一篇关于这个主题的好文章:http://www.codeproject.com/KB/architecture/smip.aspx
GJ
答案 2 :(得分:0)
public interface ISomeBehavior
{
int Sample();
}
public class A : ISomeBehavior
{
int ISomeBehavior.Sample()
{
return 1;
}
}
static class SomeExtension
{
public static int Sample(this ISomeBehavior obj)
{
return 2;
}
}
然后使用此
A a = new A();
var a1 = ((ISomeBehavior)a).Sample(); // a1 = 1
var a2 = a.Sample(); // a2 = 2
答案 3 :(得分:0)
这样的事情怎么样:
class MyClass: ThirdPartyClass
{
}
class MyFunctionality
{
public MyFunctionality(ThirdPartyClass target)
...
}
interface IMyFunctionality
{
public MyFunctionality MyFunctionality;
}
因此,接口将强制派生类必须实例化附加成员,而MyFunctionality的设计只是针对对基类的引用进行操作。但是,如果存在您需要内部访问的受保护成员,则这可能不起作用。