【问题标题】:How to use abstract classes inside a UserControl如何在 UserControl 中使用抽象类
【发布时间】:2016-03-02 17:51:34
【问题描述】:

我有一个UserControl

我希望每个 UserControl 覆盖一个抽象方法。

这是我的抽象类:

public class MyAbstract
{
    public virtual void LoadData()
    {

    }
}

这是我的用户控件,我最近尝试让它工作:

public partial class ucAbstract : UserControl, MyAbstract
{
    public ucAbstract()
    {
        InitializeComponent();
    }

    public override void LoadData()
    {
        base.Load();
        {

        }
    }
}

错误是:

“ucAbstract”类不能有多个基类:“UserControl”和“MyAbstract”

我该怎么做?

附加: 我可能需要删除这个添加并创建一个新问题。

这就是我想要达到的目标:

我的主表单包含 2 个UserControls: ucOne, ucTwo

这两个控件都有一个名为“LoadData”的方法。

我的主窗体中有一个函数:

void LoadControl(iuserControl myUserControl)
{
    myUserControl.LoadData();
}

【问题讨论】:

  • MyAbstract 需要继承 UserControl。在 C# 中不能同时继承多个类。您必须以分层方式链接继承。抱歉,如果有更好的术语可以使用。
  • C#没有多重继承
  • MyAbstract isn't abstract,而您的 ucAbstract 类正在尝试从两个基类继承,这在 C# 中是不可能的。跨度>
  • @TyCobb 谢谢。我明白你的意思
  • 虚拟和抽象不是同一个意思。 abstract 类是不能直接实例化的类,可能abstract 成员。任何派生自abstract 类的类必须 覆盖其基类的任何abstract 成员。具体类可以有virtual 成员,继承类可以可选地覆盖。

标签: c# wpf user-controls overriding


【解决方案1】:

这个怎么样。

创建一个基础class,其中包含UserControl 的所有常用方法。确保使用UserControl 类对其进行扩展

MyAbstract.cs

public abstract class MyAbstract   : UserControl
{
    public virtual void LoadData()
    {

    }
}

然后创建一个UserControl 并使用MyAbstract 类扩展它。你可以这样使用。

ucAbstract.xaml.cs

public partial class ucAbstract : MyAbstract
{
    public ucAbstract()
    {
        InitializeComponent();
    }

    public override void LoadData()
    {
        base.LoadData();
        {

        }
    }
}

另外,您需要在 xaml 中使用 <local:MyAbstract> 而不是 <UserControl>

ucAbstract.xaml

<local:MyAbstract x:Class="YourNamespace.ucAbstract"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:YourNamespace"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <TextBox />
    </StackPanel>
</local:MyAbstract> 

注意:

  • 您可以创建多个UserControls,并将MyAbstract 作为BaseClass。
  • UserControls 只允许一级继承,至少如果 MyAbstract 有一个 XAML,这肯定行不通。

参考:Partial declarations, must not specify different base classes

【讨论】:

  • 嗨,谢谢。在我的一次尝试中,我几乎就在那里。我已经按照你说的做了,但我没有将课程标记为抽象 - 也感谢链接
【解决方案2】:

C# 不支持多重继承,您不能从多个类继承(UserControlMyAbstract)。你可以使用interface 代替这样的类:

public interface IMyAbstract
{
    void LoadData();
}

那么你应该像这样实现接口:

public partial class ucAbstract : UserControl, IMyAbstract
{
   public void LoadData()
   {

   }
}

【讨论】:

  • 谢谢。因为这对我有用。我可以在 5 分钟内接受
【解决方案3】:

您实际上需要带有适当CommandParameterICommand 对象来代替您的LoadData() 方法来进行条件加载。

【讨论】:

【解决方案4】:

你可以创建你的用户控件

Public class MyUserControl : UserControl
{
public virtual LoadData()
{
// ...
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多