我在一个混凝土类中有一个只有get个人的房产.根据定义,这只能在该类的构造函数中设置.后来,我决定希望此属性属于一个构造函数较少的抽象类,具体类从该抽象类继承.如何才能使现在抽象类中的属性只能在子类的构造函数中设置?

不起作用的解决方案:

  • 如果我给这个属性一个protected set的修饰符,那么允许这个子类拥有比我要求的更多的权力.
  • init不是一个选项,因为我只想在构造函数中设置它.
  • readonly并不总是有效的,因为我使用的是C#7.3.

示例原创类:

public class FooOriginal
{
   public int IntHere { get; }
}

抽象类示例:

public abstract class FooAbstract
{
   public int IntHere { get; }
}

示例子类

public class FooChild : FooAbstract
{
   public FooChild()
   {
       // Won't compile because IntHere is get-only.
       intHere = 3;
   }
}

推荐答案

要实现这一点,您可以为基类提供一个构造函数,如果您愿意,可以将其设置为protected:

public abstract class FooAbstract
{
    public int IntHere { get; }

    protected FooAbstract(int intHere)
    {
        IntHere = intHere;
    }
}

而您的旧系统可以调用基类构造函数,例如:

public class FooOriginal : FooAbstract
{
    public FooOriginal(int intHere)
        : base(intHere) // <-- This is the magic
    {
        
    }
}

或者,如果您想按照您的示例传递一个常量值:

public FooOriginal() : base(3)
{
}

Csharp相关问答推荐

有没有方法让ASP.NET Core模型绑定器使用私有设置器来设置属性?

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

如何循环遍历XML文档 node 以使用XSLT存储值

使用LINQ to XML获取元素值列表是不起作用的

无法解析数据库上下文的服务

在多对多关系上不删除实体

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

Rider将.NET安装在哪里

Take()方法如何与IAsyncEnumerable一起使用

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

如何使用EF Core和.NET 8来upsert到具有多对多关系的表?

Lambda表达式如何与隐式强制转换一起工作?

记录类型';==运算符是否与实现IEquatable<;T&>;的类中的';equals&>方法执行等价比较?

如何从另一个类的列表中按ID取值

如何正确处置所有动态控件?

如何在Polly重试策略成功之前将HttpClient请求排队?

c#在后台实现类型化数组

如何在Xamarin.Forms中检索PanGesture事件的位置?

使用C#12中的主构造函数进行空判断

Azure队列触发器未使用隔离的工作进程执行