当前位置:编程学习 > C#/ASP.NET >>

C#3.0中有多重继承?

C#的对象系统是个单根系统,不支持类的多继承,只支持多接口实现,这在某种程度带来了一些不便:我们在系统设计时经常会抽象出一些接口,并为接口提供一个抽象类作为默认的实现,然后实际使用的类可以从抽象类派生。如果一个类实现了多接口,那我们只能选择一个抽象类作为祖先类,再将其他接口的实现手工加到类中。

这种情况在C#3.0中有了变化,我们现在可以利用C#3.0的扩展方法来实现一个“受限的多继承”。
    C#3.0中引入了扩展方法,可以利用一个静态类的静态方法为一个类或者接口添加方法,关键是添加的方法是包含实现的,由此我们可以在C#3.0中为接口提供一个带实现的方法声明,而无需额外的实现类!如果一个类实现了多个这样的接口,就可以达到类似多继承的效果。

让我们用代码测试一下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test35
{
    public
inte易做图ce ITestA{ }

    public
static
class ITestAHelper
    {
        public
static
void TestA(this ITestA obj)
        {
            Console.WriteLine("ITestAHelper.TestA");
        }
    }

    public
inte易做图ce ITestB{ }

    public
static
class ITestBHelper
    {
        public
static
void TestB(this ITestB obj)
        {
            Console.WriteLine("ITestBHelper.TestB");
        }
    }

    public
class Test : ITestA, ITestB
    {
    }

    class Program
    {
        static
void Main(string[] args)
        {
            Test obj1 =
new Test();
            obj1.TestA();
            obj1.TestB();

            Console.ReadKey();

        }
    }
}

    执行的结果:
  ITestAHelper.TestA     
  ITestBHelper.TestB



    ok!再多试一下,看看如果实现类中定义相同的方易做图怎么样:



public
inte易做图ce ITestA { }
    public
static
class ITestAHelper
    {
        public
static
void TestA(this ITestA obj)
        {
            Console.WriteLine("ITestAHelper.TestA");
        }
    }

    public
inte易做图ce ITestB { }
    public
static
class ITestBHelper
    {
        public
static
void TestB(this ITestB obj)
        {
            Console.WriteLine("ITestBHelper.TestB");
        }
    }

    public
class Test : ITestA, ITestB
    {
        //此方法与ITestA的TestA()扩展方法相同

public
void TestA()
        {
            Console.WriteLine("Test.TestA");
        }
    }

    class Program
    {
        static
void Main(string[] args)
        {
            Test obj1 =
new Test();
            //下面分别测试2种TestA()调用方式
              obj1.TestA();
            ((ITestA)obj1).TestA();

            Console.ReadKey();
        }
    }

  执行的结果:
  Test.TestA     
  ITestAHelper.TestA


    从这次的结果看,这里有一点点问题,如果实现类有相同的方法,接口的扩展方法总是被接口的实现类隐藏,那么如何多态?加上virtual试试看,似乎static方法是不能使用virtual修饰符的:

详细请看这里:http://www.netcsharp.cn/showtopic-479.aspx --------------------编程问答-------------------- 干脆支持多继承好了,搞这么麻烦 --------------------编程问答-------------------- UP --------------------编程问答-------------------- 既要多继承的便利又不要多继承的难以控制
最后就跟java的内部类一样,弄的乱七八糟的,离设计初衷越来越远了。 --------------------编程问答-------------------- 呵呵不知道没用过!
看样子是哦!微软!!!!!!!!!!!!!!!!!!!!!!!!!! --------------------编程问答-------------------- 恩~~UP~~ --------------------编程问答-------------------- 虽然没用过C#3.0,但是C#3.0的扩展方法只是语法糖而已,这样用是不对滴。 --------------------编程问答-------------------- 学习。 --------------------编程问答-------------------- UP咯..不知道有没有人打开那个地址缓慢或者完全打不开的
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,