如何在接口中实现属性

181

我有一个接口 IResourcePolicy,其中包含属性 Version。我必须实现这个属性,它包含值,在其他页面上编写的代码如下:

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

如何实现属性 version

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

1
为什么你想在接口中实现任何东西?在那里,你只需指定接口... - Stefan Steinegger
6个回答

388
在接口中,您需要指定该属性:
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),你就不能定义它是否为公共的。 - PeterX
5
没错,应该公开。我已经修复了。虽然这个问题与我试图解释的内容无关,但我还是没有太在意。 - Stefan Steinegger
18
当然相关!如果你想回答好问题,就需要让它简单易懂,这样人们才不会在下一个问题上跌倒。 - Bitterblue

27
你是指像这样吗?
class MyResourcePolicy : IResourcePolicy {
    private string version;

    public string Version {
        get {
            return this.version;
        }
        set {
            this.version = value;
        }
    }
}

1
我知道这一点,但我已经分配了值,例如irp.WrmVersion = "10.4";请看我的问题,我不想失去这个值,我必须传递它。 - peter

20

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


1
这就是我如何在其他地方实现此属性的方法。 - peter
创建一个实现该接口的类@petr,然后创建该类的实例并分配给具有接口类型的变量。 - Arsen Mkrtchyan
6
我愿意支持第一句话。但是如果接口足够的话,应该始终避免使用抽象基类。因此,在确定实际需要解决的问题之前,不应建议创建基类。 - Stefan Steinegger
2
@Stefan,我的第二句话的意思是,如果他真的需要引入默认值,那么他应该使用抽象类。 - Vitaliy Liptchinsky
1
这在c#8/.net core 3.0中已经不再是真的了。尽管如此,接口仍然不能拥有全局变量。 - silent tone

6

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

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.
 */

0
  • 但我已经赋值,使得irp.WrmVersion = "10.4";

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


private string version = "10.4';

0

你应该使用抽象类来初始化属性,而不能在接口中初始化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接