当接口被继承时,是否有方法覆盖接口中的属性

本文关键字:接口 覆盖 属性 有方法 继承 是否 | 更新日期: 2023-09-27 18:22:09

环境:MVC4C#VS2010

问题:我有一个接口,我正在考虑我的"基本"接口,定义如下:

public interface ITestModel
{
    TestViewModel model { get; set; }
    void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues);
    void Save();
}
[MetadataType(typeof(MetaData_TestViewModel))]
public partial class TestViewModel
{
    public Int32 id { get; set; }
    public string name { get; set; }
    public string comments { get; set; }
}
public class MetaData_TestViewModel
{
    [Required(ErrorMessage = "ID is required")]
    [DisplayName("Primary Key")]
    public Int32 id { get; set; }
    [Required(ErrorMessage = "Name is required")]
    [DisplayName("New Name")]
    public string name { get; set; }
    [DisplayName("Comments")]
    public string comments { get; set; }
}

使用界面:

如果我做了以下事情,一切都会如我所愿:

public class BaseViewModel : ITestModel
{
    private TestViewModel _model;
    public TestViewModel model
    {
        get { return _model; }
        set { _model = value; }
    }
    public void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues)
    {
        model = new TestViewModel();
        model.id = ReferralTypeID;
        model.name = "TEst";
        model.comments = "This is a comment";
    }
    public void Save()
    {
        int i = 1;
        return;
    }
}

现在我想继承"基本"接口,但用从TestViewModel继承的定义更改模型属性的定义,如下所示:

public interface ITestModelB : ITestModel
{
    new TestViewModelB model { get; set; }
}
public class TestViewModelB : TestViewModel
{
    public int anotherfield { get; set; }
    public string anotherstringfield { get; set; }
}

并使用如下界面:

public class AViewModel : ITestModelB
{
    private TestViewModelB _model;
    public TestViewModelB model
    {
        get
        {
            return _model;
        }
        set
        {
            _model = value;
        }
    }
    public void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues)
    {
        model = new TestViewModelB();
        model.comments = "New model created";
        model.id = 1;
        model.name = "Referral Type 1";
        model.anotherfield = profileid;
        model.anotherstringfield = UniqueKeyValues;
    }
    public void Save()
    {
        int i = 1;
        return;
    }
}    

问题是当我构建时,我得到了以下错误:

Error   1   'InterfaceTest.Models.AViewModel' does not implement interface member 'InterfaceTest.Models.ITestModel.model'. 'InterfaceTest.Models.AViewModel.model' cannot implement 'InterfaceTest.Models.ITestModel.model' because it does not have the matching return type of 'InterfaceTest.Models.TestViewModel'.

我为什么要这样做:

我正在尝试建立一个推荐系统,在该系统中,所有推荐都具有相同的基本属性和操作。每个推荐类型还具有特定于该推荐类型的属性和操作。我希望转介通过相同的控制器,这样当添加新的转介时,我只需要创建一个新的接口来处理转介。

以下是我想在我的控制器中做的事情:

ITestModel model = businessLogic.GetModel(referraltypeid);
model.PopulateNewReferralRequestModel(1, 1234, "DRC Policy, 12345678, 2/14/2014");

我会在businessLogic类中使用一个方法,根据引用类型来确定返回哪个模型类型。所有模型都将实现ITestModel接口。这样做可以让我通过同一个控制器处理所有的转介,而不必为每种转介类型都有多个控制器。

我需要什么有人能告诉我如何克服我在构建时遇到的错误吗?或者为我想要实现的目标提出另一个解决方案吗?

非常感谢您的帮助!

当接口被继承时,是否有方法覆盖接口中的属性

您可以使用显式接口实现来消除编译错误

    public class AViewModel : ITestModelB
    {
        private TestViewModelB _model;
        public TestViewModelB model
        {
            get
            {
                return _model;
            }
            set
            {
                _model = value;
            }
        }
        private TestViewModel newmodel;
        TestViewModel ITestModel.model
        {
            get { return newmodel; }
            set { newmodel = value; }
        }
        public void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues)
        {
            model = new TestViewModelB();
            model.comments = "New model created";
            model.id = 1;
            model.name = "Referral Type 1";
            model.anotherfield = profileid;
            model.anotherstringfield = UniqueKeyValues;
        }
        public void Save()
        {
            int i = 1;
            return;
        }
    } 

或者可以使用通用接口

public interface ITestModel<Tmodel>
{
    Tmodel model { get; set; }
    void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues);
    void Save();
}