C#是否可以自定义/覆盖保持其类名的类?

时间:2011-11-02 16:21:55

标签: c# class inheritance namespaces override

如果我有一个使用namespaceX.classB的类namespaceX.classA,是否可以通过使用相同的命名空间(?)和类名来自定义/覆盖/扩展classB而不破坏ClassA?如果是这样,请你解释一下我是怎么做的?

示例通过向ColumnHeaderCollection添加方法而不破坏ListView

来扩展

4 个答案:

答案 0 :(得分:5)

也许。这取决于你想做什么以及你是否可以修改B类。

查看Extension MethodsPartial Classes

扩展方法允许您在另一个静态类(例如ClassBExtensions)中创建静态方法,让您像在ClassB上一样调用它们。但是,您无权访问扩展类中的任何私有或受保护成员。

部分类允许您将成员直接添加到类中,但您需要能够修改ClassB的源,因为它需要在两个地方都声明为部分。 Partial实际上只是一种将类定义拆分为多个文件的方法。

听起来你想要一个扩展方法。

 public static class ColumnHeaderCollectionExtensions
 {
     public static void NewMethod(this ColumnHeaderCollection collection)
     { 
         //do stuff here
     }
 }

然后您可以将其称为:

myListView.Columns.NewMethod();

答案 1 :(得分:2)

如果这些类位于两个独立的命名空间中,那么这是可能的。在命名空间中不能有两种相同名称的类型。

namespace Foo
{
    class One : Bar.One
    {
    }
}

namespace Bar
{
    class One
    {
    }
}

命名空间的一个目的是解决同名类型的命名冲突。

答案 2 :(得分:1)

不直接。您将获得一个重复的定义,唯一一次允许在同一名称空间中具有相同名称的两个同时具有可见性的类是否因它们接受的泛型类型参数的数量而异。

也就是说,如果原始类标记为partial可以添加功能。

// file 1
namespace A
{
    partial public class B
    {
        public void AnOriginalMehtod() { ... }
    }
}

// file 2
namespace A
{
    partial public class B
    {
        public void AnotherMethod() { ... }
    }
}

您还可以向现有类添加扩展方法,以便为其提供更多功能。

// file 1
namespace A
{
    public class B
    {
        public void SomeMethod()
        { ... } 
    }
}

// file 2
namespace A
{
    public static class BExtensions
    {
        public static void SomeNewMethod(this B source)
        {
            // perform action on B
        }
    }
}

部分类允许您在多个文件中划分一个类,从而使您具有灵活性,但为了使其工作,原始类必须标记为partial

扩展方法对于向现有类或接口添加功能很有用,但是您必须通过它的公共接口使用该接口或类,您将无法访问私有成员。

答案 3 :(得分:0)

不太确定你想做什么,但看看“部分类”。

// this bit of the class in a file
public partial class Employee
{
    public void DoWork()
    {
    }
}

//this bit in another file
public partial class Employee
{
    public void GoToLunch()
    {
    }
}