2017-04-26 53 views
-3
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}"); 
    } 
} 

众所周知,接口只能声明成员,而我们在从那个接口继承的类中实现这些成员。界面和类的属性差异

那么有什么区别呢?为什么我必须重新声明课程中的属性?它不能使用界面中的声明吗?

+0

我不明白你在问什么你似乎理解接口和类之间的区别,你*在你的类中实现了这些属性,至于如何使用值创建它们,你需要创建一个汽车的实例,然后为汽车的属性赋值。 – mason

+0

你实现了这些属性,但没有给它们分配任何值,因为它们将具有默认值。 – FCin

+0

此代码不会编译,并且问题以不可理解的方式形成。 –

回答

1

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

您的汽车实施使用自动属性来满足界面。然而,你可以写你的车是这样的:

​​

而且由于它仍公开暴露与getter和setter一个字符串属性名称,这将是非常有效的。

首次将开创汽车(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" }; 
+0

int Id {get;设置}(在IVehicles中) public int Id {get;设置;}(在汽车) 他们都有不同的含义? – faizan

+0

@faizan接口不需要指定访问修饰符。这是因为一个接口正在描述一个班级必须创建的可公开访问的合同。因此,在接口中放置'public'将是多余的,但实现该接口的类必须使该接口描述的所有内容都公开。 – mason

+0

好吧,我现在明白了,谢谢你的帮助 – faizan

0

在您的示例中,您已定义属性在界面中必须具有getset。他们定义在类中以同样的方式创建一个“自动属性”,它处理implementationon代表您,创建后盾变量等

有关自动属性的更多阅读见https://msdn.microsoft.com/en-us/library/bb384054.aspx,如果你想深入到他们进一步。