[英]C# Properties in interfaces & abstract classes
我只是在编写一个简单的C#接口,并在其中放置了一个属性,而没有考虑太多。 例如:
public interface IMyInterface
{
string Name { get; set; }
object[][] Data { get; set;
}
我意识到当应用于接口和抽象基类时,我对属性有些困惑。 在普通类中,此语法将为其在后台生成的隐藏字符串成员生成访问器和变异器。
接口不应具有数据成员。 那么,在这种情况下,此语法是否有所不同?
那抽象类呢? 如果我在抽象基类和派生类中使用相同的语法,那么两者最终都将是隐藏成员吗?
接口不应具有数据成员。 那么,在这种情况下,此语法是否有所不同?
从技术上讲,它不是数据成员-它是具有基础数据成员的get / set方法对。 没有实现。
那抽象类呢? 如果我在抽象基类和派生类中使用相同的语法,那么两者最终都将是隐藏成员吗?
如果该类是抽象的,并且该属性是virtual
则是,您将用另一个自动实现的属性(没有意义)覆盖一个自动实现的属性。
如果类是抽象的,并且该属性不是virtual
则您仍然有两个实现,但是基类将隐藏父实现而不是覆盖它(如果它们都是自动实现的,那仍然没有意义)。
如果属性是抽象的,则抽象类不会有一个实现。 你必须实现你的具体类了get / set( 可能是自动实现的机器人不必须的)。
接口中的属性声明与实现完全分开。 因此,您可以使用自动属性来实现它
private class MyImpl : IMyInterface
{
public string Name { get; set; }
public object[][] Data { get; set; }
}
或声明自己的支持字段
private class MyImplBacked : IMyInterface
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public object[][] Data { get; set; }
}
抽象类中的相同场景
public abstract class MyAbstractClass
{
public abstract string Name { get; set; }
public abstract object[][] Data { get; set; }
}
private class MyImpl : MyAbstractClass
{
public override string Name { get; set; }
public override object[][] Data { get; set; }
}
private class MyImplBacked : MyAbstractClass
{
private string _name;
public override string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public override object[][] Data { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.