【问题标题】:Problem with C# interfaces and inheritanceC#接口和继承的问题
【发布时间】:2020-06-05 06:28:28
【问题描述】:

我想在一个类中实现以下接口:

public interface IAgro {
     AgroState agroState { get; }
}

问题是我希望我的属性实现一个从 AgroState 继承的不同类,而不是使用接口在类中实现 AgroState

public class E1_AgroState : AgroState
{
...
}

public class BasicWalkingEnemy : Entity, IAgro
{
    public E1_AgroState agroState { get; }

}

这是我习惯在 Swift 中使用协议做的事情,例如,但 C# 编译器会抱怨

“BasicWalkingEnemy”没有实现接口成员“IAgro.agroState”。 “BasicWalkingEnemy.agroState”无法实现“IAgro.agroState”,因为它没有匹配的返回类型“AgroState”。 [汇编-CSharp]csharp(CS0738)

目前我发现的一种解决方案是:

public class BasicWalkingEnemy : Entity, IAgro
{
    public AgroState agroState { get { return _agroState; } }
    public E1_AgroState _agroState { get; private set; }
}

但我认为这很不雅。 我的问题有更好的解决方案吗?

【问题讨论】:

    标签: c# unity3d inheritance interface properties


    【解决方案1】:

    通常,您这样做的方式是使用显式接口实现,这样任何只通过IAgro 了解您的对象的人只会看到AgroState,但任何知道它正在工作的代码使用BasicWalkingEnemy 将得到E1_Agrostate

    // Note: property names changed to comply with .NET naming conventions
    public class BasicWalkingEnemy : Entity, IAgro
    {
        // Explicit interface implementation
        AgroState IAgro.AgroState => AgroState;
    
        // Regular property
        public E1_AgroState AgroState { get; private set; }
    }
    

    【讨论】:

    • 我一直想知道显式实现有什么好处(我的意思是除了不同接口中的相同名称),刚刚学到了一些非常有用的东西,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多