如何在 UserControl 中使用抽象 类

How to use abstract classes inside a UserControl

我有一个UserControl

我希望每个 UserControl 重写一个抽象方法。

这是我的摘要class:

public class MyAbstract
{
    public virtual void LoadData()
    {

    }
}

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

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

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

        }
    }
}

错误是:

Class 'ucAbstract' cannot have multiple base classes: 'UserControl' and 'MyAbstract'

我该怎么做?

附加: 我可能不得不删除此添加并创建一个新问题。

这就是我想要实现的目标:

我的主窗体包含 2 个 UserControlsucOneucTwo

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

我的主窗体有一个函数:

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

C# 不支持多重继承,您不能继承多个 classes(UserControlMyAbstract)。您可以像这样使用 interface 而不是 class:

public interface IMyAbstract
{
    void LoadData();
}

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

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

   }
}

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

您可以创建您的用户控件

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

这个怎么样。

创建一个 Base class,其中包含您 UserControl 的所有常用方法。确保使用 UserControl class

对其进行扩展

MyAbstract.cs

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

    }
}

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

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> 

注:

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

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