【问题标题】:How to access private set properties in derived class [duplicate]如何访问派生类中的私有集属性[重复]
【发布时间】:2015-03-22 17:39:11
【问题描述】:

我有一个简单的继承情况如下:

我希望能够从 Class1 设置 Class2 中的属性,但事实并非如此。有没有办法设置对 Class 2 中的属性的访问,使它们像受保护的变量一样起作用?

public abstract class Class2
{
    public DateTime Added { get; private set; }
    public int ID { get; private set; }
}

public class Class1 : Class2
{
    public string ImageFilename { get; set; }
    public string LinkText { get; set; }
}

【问题讨论】:

  • 您是否尝试过将集合设为受保护?
  • 请定义“像受保护的变量一样”,因为这可能意味着很多。您是否希望无法从Class2 及其继承链外部访问这些属性?您是否希望该属性可公开获取,但受保护可设置?等等。请分享您的研究。
  • "so they act like protected variables" - 我不明白...如果你知道protected 是什么,你为什么不使用它?这个问题还有更多你没有解释的地方吗?

标签: c# inheritance


【解决方案1】:

您需要将它们设置为protected,而不是private。这使您可以从派生类而不是外部类访问它。

public abstract class Class2
{
    protected DateTime Added { get; set; }
    protected int ID { get; set; }
}

public class Class1 : Class2
{
    public string ImageFilename { get; set; }
    public string LinkText { get; set; }

    public Class1()
    {
        //You can set the variables from inside Class 1.
        base.Added = DateTime.Now();
        base.ID = 1;
    }
}

如果您希望属性仍然对外公开,​​但作为只读,您可以将各个 setter 设置为受保护:

public abstract class Class2
{
    public DateTime Added { get; protected set; }
    public int ID { get; protected set; }
}

【讨论】:

  • 啊,你每天都会学到一些东西——作为一个菜鸟,你做得很好!
  • 但是您的示例代码仍然将它们作为private
  • 您的二传手仍然是私人的。你所做的只是降低公共成员的可见性,这是​​一个重大变化。
  • 这将使 getter 受到保护,但 setter 是私有的。
  • 抱歉,我错过了私人套装。我已经相应地更新了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2011-08-23
相关资源
最近更新 更多