无法在派生类中访问基类属性 (C#)

4

我在C#/Xamarin.Forms中遇到了继承/多态的问题。有很多事情我认为我应该可以做到,但实际上我不能,从我的理解来看,似乎我没有正确地继承,所以首先要做的是:

声明

public abstract partial class CommonCell : ContentView, ICellSection
{

    public static readonly BindableProperty TitleProperty = BindableProperty.Create("Title", typeof(string), typeof(CommonCell), default(string));
    public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }
    public CommonCell()
            : base()
        {

        }
    public virtual IInputType GetInputType()
        {
            throw new NotImplementedException();
        }
}

在同一个文件中,我还声明了这个派生类:
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class CellSection<T>: CommonCell where T : View, IInputType
{
    private T _inputType;
    public T InputType
        {
            get { return _inputType; }
            set { _inputType = value; } //plus more stuff here
        }
    public CellSection ()
            :base()
        {
            //Layout Initialization
        }
    public override IInputType GetInputType() //I get an error here (Problem 2)
        {
            return InputType;
        }
}

我将只展示一个属性和一个方法,以演示我的问题,但是有许多类似的声明方式...
问题1
当我创建一个新的CellSection时,发生的情况是这样的:
CellSection<TextInput> section1 = new CellSection<TextInput>();
section1.Title = "New Title"; //This line is not allowed

我无法访问Title属性...

错误信息:CellSection<TextInput>'未包含'Title'的定义

我通过在CellSection<T>类中添加以下代码来访问它:

public string Title
    {
        get { return base.Title; }
        set { base.Title = value; }
    }

但这似乎是不必要和冗余的...肯定有其他方法...

问题2

另一个问题是我不能覆盖虚拟方法GetInputType(),它也出现在上面的代码中,但这就是我所说的那一行:

public override IInputType GetInputType()
{
    return InputType;
}

错误信息:'CellSection<T>.GetInputType()': 没有适合的方法可以重写

问题3

最后一个问题是,当我试图从不同的类/文件中引用/转换CellSection<T>ICellSection(由基类CommonCell实现)时,出现了问题。

List<ICellSection> Sections = new List<ICellSection> { section1, section2 };

我遇到了一个错误,它是不允许的。

错误信息:参数 1:无法将类型为“CellSection<TextInput>”的对象强制转换为类型“ICellSection”

对于这个问题,我更加不确定是否可能(找不到相关示例),但是问题 1 和 2 我就是不明白为什么不能工作,因为它们似乎非常简单直接...


2
如果CommonCell是一个抽象类,为什么要实现一个只会抛出NotImplementedException的虚方法呢?为什么不直接声明该方法为抽象方法public abstract IInputType GetInputType();呢? - Adwaenyth
1
请问您能否提供构建该项目时出现的错误信息截图? - Ankush Jain
无法设置只读属性的值 - TitleProperty - Ankush Jain
@AnkushJain 我已经更新了原始帖子并提供了特定的错误消息(评论不能正确格式化)。 - Simen91
@Adwaenyth 我已经尝试了两种方法,但它们都给出了相同的错误。 - Simen91
@AnkushJain readonly修饰符在GetValue()和SetValue()方法中被避免使用。这些是内置的Xamarin方法,我看到的所有示例都使用了readonly修饰符。顺便说一句,如果我在同一个类中完成所有操作,代码可以正常工作,但是当我使用继承时就不行了。问题在于我需要避免在对泛型类CellSection<T>的引用中使用特定类型,这就是我需要将其拆分为两个类的原因。 - Simen91
1个回答

1
每一个客服员工都会这样说:
"你试过关掉然后再打开吗?"
我:
"该死...是的,我已经尝试过了"
结果发现这个问题是Visual Studio或Xamarin的bug。我删除了所有相关文件并将它们添加回去(将相同的旧代码复制粘贴到新文件中)。嘭!现在一切都被正确地继承了。我不知道是什么原因导致了这个问题,因为我认为这应该是.projitems文件中的引用问题,但实际上那个文件没有什么变化(在git中检查只有几行代码位置改变)。
如果将来有其他人遇到同样或类似的问题:我在出现这个问题时已经重启了多次Visual Studio。我在出现这个问题时至少重启了一次我的机器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接