【问题标题】:C# is it possible to customise/override a class keeping its class name?C# 是否可以自定义/覆盖保留其类名的类?
【发布时间】:2011-12-20 11:44:57
【问题描述】:

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

通过在不破坏 ListView 的情况下向 ColumnHeaderCollection 添加方法来扩展示例

【问题讨论】:

  • 您可以使用扩展方法向类添加方法,但您无能为力。
  • 你能举个例子说明你想要达到的目标吗?
  • @andicrook:你能解释一下你想通过这样做实现什么,也许我们可以建议另一种方法?
  • 您希望如何区分具有完全相同全名的类的两个变体? (如果你不能区分它们,那有什么意义呢?)
  • @Kirk Woll Ruby 有别名我想知道这是否可能

标签: c# class inheritance namespaces overriding


【解决方案1】:

不直接。您将得到一个重复的定义,唯一允许在同一个命名空间中具有相同名称的两个类都可见的情况是它们接受的泛型类型参数的数量不同。

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

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

// file 2
namespace A
{
    public partial 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

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

【讨论】:

    【解决方案2】:

    也许吧。这取决于您要做什么以及是否可以修改 B 类。

    看看Extension MethodsPartial Classes

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

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

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

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

    你可以这样称呼它:

    myListView.Columns.NewMethod();
    

    【讨论】:

    • 非常感谢扩展方法似乎解决了我遇到的问题。
    【解决方案3】:

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

    喜欢

    // 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()
        {
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果这些类位于两个单独的命名空间中,这是可能的。一个命名空间内不能有两种同名的类型。

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

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

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        • 2021-03-22
        • 1970-01-01
        相关资源
        最近更新 更多