【问题标题】:How many classes can you inherit from in C#?你可以在 C# 中继承多少个类?
【发布时间】:2010-08-30 13:42:49
【问题描述】:

您可以从.NET 中继承多少个类?

有几个后端 C# 文件我想共享单独的静态方法,但它们都在不同的类中。有没有办法继承多个类?

示例代码将不胜感激。

【问题讨论】:

  • 你的代码结构如何?您是尝试从单个类中调用静态方法还是尝试做一些不同的事情?如果您试图将一堆静态方法组合在一起,接口将无济于事。
  • 因为方法是静态的(假设是公共的),你可以随时从任何类访问它们,不需要“继承”一个对象就可以使用它的静态方法。
  • @zach 我认为其中大部分都属于实用静态方法的类别,这些方法将被类后面的几个不同代码使用。我使用常用​​方法的方式与使用 Math 类的方式非常相似。

标签: c# .net asp.net


【解决方案1】:

C# 不支持多重继承(意味着一个类从多个类继承)。但是,您可以在单个类中实现多个接口。

就将继承的类链接在一起而言,本身没有限制。请记住您将引入系统的复杂性。使用继承时,请确保在“is a”场景中使用它。猎豹是一种动物。马自达是汽车。否则,您的继承会将您的类与更难以维护的设计紧密结合。

如果它们是静态“实用”方法,则直接调用它们而不继承。除非这些方法属于您正在创建的实体,否则您不应使用继承。

【讨论】:

  • @jordan 我将从其中一个类中使用的大多数方法都是实用方法。如果是这种情况,你会如何建议我使用/不使用继承。
  • 在这种情况下,只需在使用它的类中使用 StaticClassName.StaticMethodName(...)。对于这种情况,您不需要继承。一个简单的调用就可以了。继承只能用于创建属于父类的更“专业化”类型的新类——而不是授予对客户端类之外的方法的访问权限。
【解决方案2】:

您只能从单个类继承。但是可以实现多个接口。

【讨论】:

  • 虽然这是正确的,但我认为实际上并没有回答 cfarm54 提出的问题。
  • 问题是:有没有办法继承多个类?虽然我没有提供解决方案,但我确实正确回答了问题。
【解决方案3】:

假设你有 Utils.cs:

internal class Utils {
    public static void Log(string str) {
        // log str to a file...
    }
}

并且有一个 DB.cs 使用 Log 方法并且在与 Utils 类相同的命名空间中:

public class DB {
    public void SaveToDB() {
        // some db operations
        Utils.Log("DB operation successful");
    }
}

由于 Log 方法是静态的,你不需要初始化 Utils 类来使用这个方法。

作为结论,您不能使用多重继承,但对于您的情况,您也不需要它。您可以使用没有多重继承的静态方法。

【讨论】:

  • 感谢这是我一直在寻找的与@jordan 配对的答案
【解决方案4】:

您不能在 C# 中进行多重继承。

如果不是因为你想共享静态方法,你可以使用接口来达到同样的目的。

【讨论】:

  • (-1)"你可以使用接口达到同样的目的。"错误的。用户明确表示他想“共享单独的静态方法”。接口没有达到同样的目的。我不支持多重继承,我只是说你的说法是错误的。
【解决方案5】:

您可以在“链”中继承任意数量的类,但.NET 语言不允许多重继承。

.NET 中多重继承的唯一选择是接口。

【讨论】:

    【解决方案6】:

    只要适当地设置访问器,静态方法无论如何都或多或少是共享的(实际上,它们在VB中使用了关键字Shared);它们属于哪个类没有区别,因为它们与任何实例化对象都是断开的。

    要调用静态方法,请在其前面加上声明它的类的名称:

    MyClass.MyUtilityMethod();
    

    访问者必须是public,或者如果调用者和方法在同一个项目/程序集中,它可以是internal

    如果您的目标只是为静态方法创建单点访问,您可以创建一个适当地转发调用的类:

    public static class SharedMethods
    {
        public static void SharedMethod1()
        {
            ClassA.SharedMethod1();
        }
    
        public static string GetName()
        {
            return NameProvider.GetName();
        }
    
        public static int GetCount()
        {
            return CountClass.GetCount();
        }
    }
    

    这样您就可以通过SharedMethods.GetName() 等访问所有内容。

    【讨论】:

    • 这种技术称为委托。正如 Jay 正确地指出的那样,这对你没什么好处。
    【解决方案7】:

    在 .NET 中,您只能从一个基类继承,但可以实现多个接口。

    对于像您这样的 ASP.NET 特定情况,您可以执行以下操作:

    public class BasePage : Page
    {
        public string SomeMethod() { //Magic happens here }
    }
    

    并让您的网络表单在代码隐藏中从 BasePage 继承。

    另一个经常遵循的课程是制作一个包含所有静态方法的自定义静态类。确定您是否正在使用 ASP.NET 特定的东西来为它们添加前缀 HttpContext.Current。

    例如:

    public static class HelperClass
    {
        public static string GetUsernameFromSession()
        {
            return HttpContext.Current.Session["Username"].ToString();
        }
    }
    

    【讨论】:

      【解决方案8】:

      您不能从多个类继承。但是,您可以将相互继承的类串在一起。

      班级员工

      班级经理:员工

      类区域总监:经理

      因此,如果您的程序中有一个完整的命名/员工 ID/联系信息方案,您可以从员工那里继承该方案。然后,为经理详细说明信息,然后为区域总监提供更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多