【问题标题】:difference of property in interface and class [closed]接口和类中的属性差异[关闭]
【发布时间】:2017-04-26 15:32:01
【问题描述】:
interface IVehicle
{
    int Id { get; set; }

    string Name { get; set; }

    void Print();          
}

class Car : IVehicle
{
    public int Id { get; set; }

    public string Name { get; set; }

    public void Print()
    {
        Console.WriteLine($"Id {Id} Name {Name}");
    }
}

众所周知,接口只能声明成员,我们在继承自该接口的类中实现这些成员。

那么有什么区别呢?为什么我必须重新声明类中的属性?不能使用接口的声明吗?

【问题讨论】:

  • 我不明白你在问什么。您似乎了解接口和类之间的区别。你确实在你的类中实现了这些属性。至于用值创建它们,您将创建一个汽车实例,然后将值分配给汽车的属性。
  • 您实现了这些属性,但没有为它们分配任何值,这很好,因为它们将具有默认值。
  • 一个接口定义了一个类必须实现什么。这就是区别。
  • 这个问题以及许多其他问题都可以通过获得一本不错的 c# 初学者书籍来回答。你应该这样做。
  • 接口定义了实现它的类必须遵守的契约才能编译。接口并没有说明如何实现必须完成,只说明它满足接口。例如,您为name 创建了一个字符串属性,该属性必须公开一个getter 和setter。您的汽车使用自动属性来满足界面。但是,您可以像这样编写您的汽车:private string _name; public string name { get { return _name;} set { _name = value; } },这将是完全有效的,因为它仍然公开了带有 getter 和 setter 的字符串属性名称。

标签: c# oop


【解决方案1】:

接口定义了一个约定,实现它的类必须遵守才能编译。接口并没有说明必须如何实现,只说明它满足接口。例如,您为 Name 创建了一个字符串属性,该属性必须公开一个 getter 和 setter。

您的 Car 实现使用自动属性来满足接口。然而,你可以这样写你的车:

class Car : IVehicle
{
    public int Id { get; set; }

    private string _name;

    public string Name { get { return _name; } set { _name = value; } }

    public void Print()
    {
        Console.WriteLine($"Id {Id} Name {Name}");
    }
}

这将是完全有效的,因为它仍然公开使用 getter 和 setter 公开字符串属性 Name。

当您第一次创建汽车时(Car myCar = new Car();,它的属性将具有默认值。但您可以修改这些值:

IVehicle myCar = new Car();
myCar.Name = "The General";

//alternate syntax using object initializer
IVehicle schoolBus = new Car { Name = "Magic School Bus" };

【讨论】:

  • int ID { 获取; set}(在 IVehicles 中) public int Id {get; set;}(在汽车中)它们的含义不同?
  • @faizan 接口不需要指定访问修饰符。这是因为接口描述了一个类必须创建的可公开访问的契约。所以把public放在接口里面是多余的,但是实现接口的类必须把接口描述的所有东西都公开。
  • 好的,我现在知道了,感谢您的帮助
【解决方案2】:

在您的示例中,您已定义属性必须在接口中具有getset。在类中以相同的方式定义它们会创建一个“自动属性”,它代表您处理实现、创建支持变量等。

如果您想进一步了解自动属性,请参阅 https://msdn.microsoft.com/en-us/library/bb384054.aspx 了解更多关于自动属性的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2012-10-22
    • 2013-12-31
    相关资源
    最近更新 更多