C# 在基类构造函数中使用派生类属性

C# 在基类构造函数中使用派生类属性,c#,C#,在下面的代码中,我需要Base类构造函数来使用Derived类属性ServiceUrl。我不能将ServiceUrl定义为静态的,因为它的值是基于派生的类构造函数参数计算的。我无法将ServiceUrl作为构造函数参数传递给Base类,因为计算并不像图中所示的那么简单,可能需要访问Base/派生的类中的其他字段 对于最好的解决办法有什么建议吗?我有权对Base和Derived类结构进行任何更改,以达到此目的 abstract class Base { public abstract s

在下面的代码中,我需要
Base
类构造函数来使用
Derived
类属性
ServiceUrl
。我不能将
ServiceUrl
定义为静态的,因为它的值是基于
派生的
类构造函数参数计算的。我无法将
ServiceUrl
作为构造函数参数传递给
Base
类,因为计算并不像图中所示的那么简单,可能需要访问
Base
/
派生的
类中的其他字段

对于最好的解决办法有什么建议吗?我有权对
Base
Derived
类结构进行任何更改,以达到此目的

abstract class Base 
{
    public abstract string ServiceUrl { get; }

    public Base()
    {
        Console.WriteLine(ServiceUrl);
    }
}

class Derived : Base
{
    public override string ServiceUrl { get; private set; }

    public Derived(string rootUrl) : base()
    {
        ServiceUrl = rootUrl + "/service";
    }
}

基类构造函数总是在派生类构造函数之前被调用。因此,有两种解决方案:

  • 在基类的构造函数中使用参数:

    abstract class Base 
    {
        public string ServiceUrl { get; }
    
        public Base(string serviceUrl)
        {
            ServiceUrl = serviceUrl;
    
            Console.WriteLine(ServiceUrl);
        }
    }
    
    class Derived : Base
    {
        public Derived(string rootUrl) : base(rootUrl + "/service")
        {
        }
    }
    
  • 不要在构造函数中使用变量。以后再使用它

  • 基类构造函数总是在派生类构造函数之前被调用。因此,有两种解决方案:

  • 在基类的构造函数中使用参数:

    abstract class Base 
    {
        public string ServiceUrl { get; }
    
        public Base(string serviceUrl)
        {
            ServiceUrl = serviceUrl;
    
            Console.WriteLine(ServiceUrl);
        }
    }
    
    class Derived : Base
    {
        public Derived(string rootUrl) : base(rootUrl + "/service")
        {
        }
    }
    
  • 不要在构造函数中使用变量。以后再使用它

  • 它必须在构造函数上吗?因为你首先调用基本构造函数,然后才可以在构造函数中启动东西…是的。。我也认为传递给构造函数是这种情况下的常识。我可能可以将基类构造函数称为
    base(GetServiceUrl())
    ,它在内部设置
    ServiceUrl
    ,并返回其值。它必须在构造函数上吗?因为你首先调用基本构造函数,然后才可以在构造函数中启动东西…是的。。我也认为传递给构造函数是这种情况下的常识。我可能可以将基类构造函数称为
    base(GetServiceUrl())
    ,它在内部设置
    ServiceUrl
    ,并返回其值。这主意不错。。我应该在基类中将
    ServiceUrl
    作为非
    abstract
    属性。好主意。。我应该将
    ServiceUrl
    作为基类中的非
    abstract
    属性。