【问题标题】:C# how to use a specific method with interfacesC#如何使用带有接口的特定方法
【发布时间】:2017-06-03 15:23:07
【问题描述】:

我有 2 个类和一个接口: ProgramsuperSecretWorkopenDoor

我想要做的是,每当我的类使用接口时,我希望该接口调用继承它的类的特定方法。

我知道我可以只使用 superSecretWork 类,但这不是重点。我可能想继承另一个基类,但需要其他类的一部分(由其他接口使用)。

代码示例:

namespace Test
{
    class Program: openDoor
    {
        static void Main(string[] args)
        {
        }
    }

    public interface openDoor
    {
        bool open();
    }
    public class superSecretWork : openDoor
    {
        /// <summary>
        /// I only want this method to be used when using the interface
        /// </summary>
        /// <returns></returns>
        public bool open()
        {
            //some custom logic here
            return true;
        }
    }
}

【问题讨论】:

  • 接口不是这样工作的。
  • 如果你执行 `openDoor obj = new superSecretWork();` 并在 obj 上调用方法,它将调用来自 superSecretWork 类的方法。你为什么不自己做任何事情并试图弄清楚会发生什么?
  • 类不继承自接口,它实现接口。 MSDN 告诉我们接口“只包含方法、属性、事件或索引器的签名”。接口与实现无关。它们只是数据传递合同。它们为所有实现它们的类定义了必需的成员、属性等。诸如调用方法或定义它们之类的东西完全超出了它们的范围。
  • 如果你在同一个例子周围添加更多细节会更清楚。假设有另一个类实现了该接口。现在,如果在该类的对象上调用接口方法,您希望在 program.cs 中发生什么?接口不调用其实现类的任何方法。提供更多示例代码和细节将有助于更多地理解问题。
  • how do you inherit multiple base classes? 不应该是原始帖子中的问题吗?这在 Java 和 C# 等现代 OO 语言中是不可能的。您可以通过在一个类中实现两个接口并从该类继承另一个类来做到这一点,这样您就拥有两个接口的功能。

标签: c# inheritance interface


【解决方案1】:

如果不将其转换为接口,则无法阻止某人调用类的方法。

例如:

public interface IDoesSomething
{
    void DoSomething();
}

public class DoerOfStuff : IDoesSomething

    void DoSomething()
    {
        // whatever
    }
}

您无法阻止某人在 DoerOfStuff 的实例上调用 DoSomething。这个类有那个方法,所以有人可以调用它。

你可以做的是让一个类实现多个接口,并根据一个方法应该看到的接口来转换一个类。

例如:

public interface IFryCook
{
    void Fry(FrenchFries fries);
}

public interface IGrillCook
{
    void Grill(Burger burger);
}

public class FastFoodCook : IFryCook, IGrillCook
{
    public void Fry(FrenchFries fries) { }
    public void Grill(Burger burger) { }
}

如果你这样做:

public void ProcessFrenchFryOrder(IFryCook frycook)

您可以将FastFoodCook 的实例传递给该方法,但它只会被“视为”为IFryCook 的实例。该方法不知道该类还实现了其他方法。

重新考虑是否要使用类继承也很好。听起来这已经给你的问题增加了一些困难。如果您在类A 中具有您想要在类B 中的功能,那么从A 继承通常会导致困难。类B 最好依赖于类A 的单独实例。原则是“favor composition over inheritance”。如果我们让类一起工作的方式是让它们相互继承,那么我们会把自己画到一个角落,因为迟早我们会想要使用两个类的功能,而我们不能同时继承它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2017-04-19
    • 2023-03-29
    • 2021-08-22
    • 1970-01-01
    • 2020-04-20
    • 2021-06-11
    相关资源
    最近更新 更多