与 get 属性的接口,带有 get 的抽象类,带有 get 和 set 的子类

本文关键字:get 带有 set 子类 抽象类 属性 接口 | 更新日期: 2023-09-27 17:56:50

我正在尝试有一个接口,该接口声明属性必须具有get:

public interface IValue {
    public int Value { get; }
}

然后让一个抽象类也定义它,但保持抽象:

public abstract class BaseClass : IValue {
    public abstract int Value { get; }
}

然后我想允许一个子类定义 getter 并添加一个 setter:

public class SubClass : BaseClass {
    public int Value { get; set; }
}

我收到如下错误:

'SubClass.Value' hides inherited member `BaseClass.Value'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword

如果我尝试:

public class SubClass : BaseClass {
    public override int Value { get; set; }
}

我得到:

`SubClass.Value.set': cannot override because `BaseClass.Value' does not have an overridable set accessor

有没有办法允许子类在从仅定义 getter 的抽象类继承时选择性地添加 setter?

更新:澄清一下,我知道我可以做的解决方法。我的目标是看看我能做的最干净的方法是什么。我不只在 BaseClass 上抛出一个公共二传手的原因是,BaseClass 的某些子类可能没有公共二传手。最终目标基本上只是为它们常用的时间提供一个共同的价值获取器。

与 get 属性的接口,带有 get 的抽象类,带有 get 和 set 的子类

你不能覆盖 getter,并添加新的 setter。当属性编译为 get_Valueset_Value 方法时,这就是您的代码:

public interface IValue
{
    int get_Value();
}
public abstract class BaseClass : IValue
{
    public abstract int get_Value();
}
public class SubClass : BaseClass
{
    public override int get_Value() { /* ... */ }
    // there's no set_Value method to override in base class
    public override void set_Value(int value) { /* ... */ }
}

至少有三种方法:

  • SubClass中定义new int Value属性(注意,然后有区别);
  • 覆盖Value属性并在SubClass中添加SetValue方法;
  • BaseClass中定义资源库并覆盖属性。
  1. 'SubClass.Value'隐藏继承成员'BaseClass.Value'。若要使当前成员重写该实现,请添加 override 关键字。否则添加 new 关键字

是警告不是错误。它只是说你在抽象和具体类中都有public int Value。你的抽象类有此属性的实现,所以当你在具体类中再次声明它时,你只需用新属性替换它。所以编译器建议你使用'new'这个词来达到这个目的。

  1. 要使用public override int Value { get; set; }你必须在基类中将其标记为'virtual'。只能覆盖虚拟成员。

    类 A { public virtual int Value { get; set; } }类 B : A { public override int value { get; set; } }

P.S. 默认情况下,接口成员是公共和抽象的。因此,如果您在接口中声明 getter 和 setter - 您必须在具体类中实现它。

尝试使用以下代码:

public interface IValue
{
    int Value { get; set; }
}
public abstract class BaseClass
{
    int value;
    int Value { get { return value; } }
}
public class SubClass : BaseClass, IValue
{
    public int Value { get { return Value; } set { this.Value = value; } }
}

似乎根本没有办法在不预先声明二传手的情况下添加中间带有抽象类的集合。我尝试了很多不同的组合,但没有运气。

最后,我最终做到了,这并不理想,但至少让我不会到处都有二传手。

public interface IValue {
    public int Value { get; }
}
public abstract class BaseClass : IValue {
    public abstract int Value { get; }
}
public class SubClass : BaseClass {
    protected int val;
    public int Value { get { return val; } }
    public int SetValue (int value) { val = value; }
}
public class SubClassWithoutSetter : BaseClass {
    public int Value { get { return 50; } }
}

基本上,只做一个"经典"的 setter,因为似乎没有语法支持让我在事后添加 setter 属性。

如果 C# 实现类似的东西会很好:

public int Value { override get; set; } // note: this does not work