【问题标题】:How to implement a property in an interface如何在接口中实现属性
【发布时间】:2010-12-08 06:46:54
【问题描述】:

我的接口IResourcePolicy 包含属性Version。我必须实现这个包含值的属性,其他页面中写的代码:

IResourcePolicy irp(instantiated interface)
irp.WrmVersion = "10.4";

如何实现属性version

public interface IResourcePolicy
{
   string Version
      {
          get;
          set;
      }
}

【问题讨论】:

  • 为什么要在接口中实现任何东西?在那里你只需指定接口...

标签: c# .net


【解决方案1】:

你应该使用抽象类来初始化一个属性。不能在界面中初始化。

【讨论】:

    【解决方案2】:

    在接口中使用属性的简单示例:

    using System;
    interface IName
    {
        string Name { get; set; }
    }
    
    class Employee : IName
    {
        public string Name { get; set; }
    }
    
    class Company : IName
    {
        private string _company { get; set; }
        public string Name
        {
            get
            {
                return _company;
            }
            set
            {
                _company = value;
            }   
        }
    }
    
    class Client
    {
        static void Main(string[] args)
        {
            IName e = new Employee();
            e.Name = "Tim Bridges";
    
            IName c = new Company();
            c.Name = "Inforsoft";
    
            Console.WriteLine("{0} from {1}.", e.Name, c.Name);
            Console.ReadKey();
        }
    }
    /*output:
     Tim Bridges from Inforsoft.
     */
    

    【讨论】:

      【解决方案3】:

      在界面中,你指定属性:

      public interface IResourcePolicy
      {
         string Version { get; set; }
      }
      

      在实现类中,需要实现:

      public class ResourcePolicy : IResourcePolicy
      {
         public string Version { get; set; }
      }
      

      这看起来很相似,但完全不同。在界面中,没有代码。您只需指定一个带有 getter 和 setter 的属性,无论它们做什么。

      在课堂上,您实际上实现了它们。最短的方法是使用{ get; set; } 语法。编译器将创建一个字段并为其生成 getter 和 setter 实现。

      【讨论】:

      • Version 在课堂上是公开的怎么说?啊,我明白了我的问题:如果你显式地实现接口(例如IResourcePolicy.Version,你不能定义它是否是公共的。
      • 你说得对,它应该是公开的。我修好了它。我不太关心这个,因为它与我试图解释的事情无关。
      • 当然是相关的!如果你想提供一个好的答案,你需要让人们变得简单。所以他们不会偶然发现下一个问题。
      【解决方案4】:
      • 但我已经指定了 irp.WrmVersion = "10.4";

      J.Random Coder 的答案并初始化版本字段。

      
      private string version = "10.4';
      

      【讨论】:

        【解决方案5】:

        你的意思是这样的?

        class MyResourcePolicy : IResourcePolicy {
            private string version;
        
            public string Version {
                get {
                    return this.version;
                }
                set {
                    this.version = value;
                }
            }
        }
        

        【讨论】:

        • 这个我知道,但是我已经分配了这样的值,例如 irp.WrmVersion = "10.4";看看我的问题,我不需要失去那个价值,我必须通过它
        【解决方案6】:

        接口不能包含任何实现(包括默认值)。你需要切换到抽象类。

        【讨论】:

        • 这就是我如何在其他地方实现这个属性
        • 创建一个实现该接口的类@petr,然后为该类创建实例并分配给具有接口类型的变量
        • 我会投票给第一句话。但是,如果接口足够,则应始终避免使用抽象基类。所以在你知道实际应该解决什么问题之前,你不应该建议创建一个基类。
        • @Stefan,第二句话的意思是,如果他真的需要引入默认值,那么他应该使用抽象类。
        • c#8/.net core 3.0 不再适用。接口仍然不能有全局变量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 2016-08-20
        • 1970-01-01
        相关资源
        最近更新 更多