C# 在.NET中,有哪些替代多重继承的好方法?

C# 在.NET中,有哪些替代多重继承的好方法?,c#,.net,.net-3.5,inheritance,multiple-inheritance,C#,.net,.net 3.5,Inheritance,Multiple Inheritance,在WPF应用程序中,我的类层次结构遇到了一些问题。这是两个继承树合并在一起的问题之一,在没有多重继承的情况下,无法找到任何逻辑方法使继承顺利工作。我想知道是否有人有什么好主意可以让这种系统工作,而不让它无法跟踪或调试 这里有两个选项;使用接口,或使用组合。老实说,接口非常强大,读了这一行之后 接口解决方案对我来说毫无意义。(老实说,接口对我来说从来没有什么意义…) 我认为你应该学会如何正确使用它们。也就是说,如果多个类只需要一些逻辑,但这些类从同一基类继承没有意义,那么只需创建一个类来封装该逻

在WPF应用程序中,我的类层次结构遇到了一些问题。这是两个继承树合并在一起的问题之一,在没有多重继承的情况下,无法找到任何逻辑方法使继承顺利工作。我想知道是否有人有什么好主意可以让这种系统工作,而不让它无法跟踪或调试

<我是一个低级的工程师,所以我的第一个想法总是“哦!我只写一些在C++中的课程,然后从外部引用它们!然后我可以拥有我所有的旧学校OO乐趣!”唉,这不利于当你需要从托管控件继承… 请允许我显示当前投影类图的一个片段:

 ____________________________________      _____________________________________
| CustomizableObject                 |    | System.Windows.Controls.UserControl |
|____________________________________|    |_____________________________________|
|   string XAMLHeader()              |                        ▲
|   string XAMLFooter()              |◄--┐                    |
|   CustomizableObject LoadObject()  |   \                    |
|   <Possible other implementations> |    \                   |
|____________________________________|     \                  |
         ▲                      ▲           \                 |
         |                      |            \                |
         |                      |             \               |
 _________________    ______________________   \    _____________________
| SpriteAnimation |  | SpriteAnimationFrame |  └---| CustomizableControl |
|_________________|  |______________________|      |_____________________|
                                                      ▲             ▲
                                                      |             |
                                                      |             |
                                                  ________    _____________
                                                 | Sprite |  | SpriteFrame |
                                                 |________|  |_____________|
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu_____________________________________
|自定义对象| | System.Windows.Controls.UserControl|
|____________________________________|    |_____________________________________|
|字符串XAMLHeader()|▲
|字符串XAMLFooter()|◄--┐                    |
|自定义对象LoadObject()||
|    |    \                   |
|____________________________________|     \                  |
▲                      ▲           \                 |
|                      |            \                |
|                      |             \               |
_________________    ______________________   \    _____________________
|SpriteAnimation | | SpriteAnimationFrame |└---| 自定义控制|
|_________________|  |______________________|      |_____________________|
▲             ▲
|             |
|             |
________    _____________
|雪碧| |雪碧框|
|________|  |_____________|
问题很清楚:将CustomizealObject和CustomizelControl对象树分开,并将UserControl插入其中一个树中,但不能同时插入这两个树中

将CustomableObject的实现移动到其派生类中没有实际意义,因为实现不会因类而异。此外,如果要多次实现它,那将非常混乱。所以我真的不想让CustomableObject成为一个接口。接口解决方案对我来说毫无意义。(老实说,接口对我来说从来没有什么意义…)


我再说一遍,有人有什么好主意吗?这个真是个麻烦。我想更多地了解如何使接口与我的对象树一起工作,而不是与之对抗。我正在使用WPF和C制作这个简单的sprite引擎,这是一个坚实的练习,比任何东西都重要。这在C++中是很容易解决的,但是我需要知道如何在托管环境下解决这些问题,而不是在困难的时候把我的手放到空中,然后再运行到Win32。

看起来你必须求助于接口和对象组合。p> 这里有两个选项;使用接口,或使用组合。老实说,接口非常强大,读了这一行之后

接口解决方案对我来说毫无意义。(老实说,接口对我来说从来没有什么意义…)


我认为你应该学会如何正确使用它们。也就是说,如果多个类只需要一些逻辑,但这些类从同一基类继承没有意义,那么只需创建一个类来封装该逻辑,并将该类的成员变量添加到给您带来问题的类中。这样,所有类都包含逻辑,但可以在继承层次结构中分离。如果类应实现公共接口,则使用接口

一种方法是使用带有接口的扩展方法来提供“派生类”实现,很像System.Linq.Queryable:

interface ICustomizableObject
{
    string SomeProperty { get; }
}

public static class CustomizableObject
{
    public static string GetXamlHeader(this ICustomizableObject obj)
    {
        return DoSomethingWith(obj.SomeProperty);
    }

    // etc
}

public class CustomizableControl : System.Windows.Controls.UserControl, ICustomizableObject
{
    public string SomeProperty { get { return "Whatever"; } }
}
用法:只要您对定义扩展方法的命名空间具有using指令(或与之位于同一命名空间中),则:

var cc = new CustomizableControl();
var header = cc.GetXamlHeader();

我正在研究这个问题,
customableobject
只是希望将其制作成一个接口(因为每个具体类型都可以转换为object,所以名称的这一部分是多余的)。您遇到的问题是,您不确定如何保留一些基本逻辑,这些基本逻辑将被共享或仅因实现而略有不同,您希望将这些逻辑存储在树本身中,以便它以多态方式工作(这是一个词吗?)

您可以通过委派来实现这一点。我不确定到底是哪些成员给你带来了麻烦,但也许更像这样:

 ____________________________________      _____________________________________
| ICustomizable                      |    | System.Windows.Controls.UserControl |
|                                    |    |_____________________________________|
|   Func<string> XAMLHeader;         |                        ▲
|   Func<string> XAMLFooter          |◄--┐                    |
|   ICustomizabl LoadObject() |   \                    |
|   <Possible other implementations> |    \                   |
|____________________________________|     \                  |
         ▲                      ▲           \                 |
         |                      |            \                |
         |                      |             \               |
 _________________    ______________________   \    _____________________
| SpriteAnimation |  | SpriteAnimationFrame |  └---| CustomizableControl |
|_________________|  |______________________|      |_____________________|
                                                      ▲             ▲
                                                      |             |
                                                      |             |
                                                  ________    _____________
                                                 | Sprite |  | SpriteFrame |
                                                 |________|  |_____________|
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu_____________________________________
|ICustomizable | | System.Windows.Controls.UserControl|
|                                    |    |_____________________________________|
|Func XAMLHeader;|▲
|Func XAMLFooter|◄--┐                    |
|ICustomizabl LoadObject()||
|    |    \                   |
|____________________________________|     \                  |
▲                      ▲           \                 |
|                      |            \                |
|                      |             \               |
_________________    ______________________   \    _____________________
|SpriteAnimation | | SpriteAnimationFrame |└---| 自定义控制|
public interface IClassA
{
    void Foo1();
    void Foo2();
}

public interface IClassB
{
    void Foo3();
    void Foo4();
}

public class ClassA :IClassA
{
    #region IClassA Members

    public void Foo1()
    {
    }

    public void Foo2()
    {
    }

    #endregion
}

public class ClassB :IClassB
{
    #region IClassB Members

    public void Foo3()
    {
    }

    public void Foo4()
    {
    }

    #endregion
}

public class MultipleInheritance :IClassA, IClassB
{
    private IClassA _classA;
    private IClassB _classB;

    public MultipleInheritance(IClassA classA, IClassB classB)
    {
        _classA = classA;
        _classB = classB;
    }

    public void Foo1()
    {
        _classA.Foo1();
    }

    public void Foo2()
    {
        _classA.Foo2();
        AddedBehavior1();
    }

    public void Foo3()
    {
        _classB.Foo3();
        AddedBehavior2();
    }

    public void Foo4()
    {
        _classB.Foo4();
    }

    private void AddedBehavior1()
    {

    }

    private void AddedBehavior2()
    {

    }
}