从具有相同名称的属性的接口继承

时间:2015-04-29 11:56:06

标签: c# inheritance

我有一个接口IProduct和两个部分类SearchedProductInternal和SearchedProductExternal。 这两个类是来自第三方Web服务搜索的扩展类,但两者都返回略有不同的结果类型。 我想使用两者的接口,所以返回的类型是相同的。我知道如何继承,但我该怎么做才能返回"姓名"因为接口和SearchedProductInternal都有相同的对象名?

我的界面类似如下:

   public interface IProduct
        {  
            string Name { get; }
            string ID { get; }
            string DescriptionShort { get; }
            string DescriptionLong { get; }
         } 

My Object SearchedProductInternal具有以下属性:

     string Name; 
     int ObjectIdField;
     string DescriptionShortField;
     string DescriptionLongField;

所以我的这就是我继承的地方

  public partial class SearchedProductInternal : IProduct
        {

            public string ID
            {
                get { return ObjectIdField.ToString(); }
            }
            public string Name
            {
                //What do I do here?
            }
            public string DescriptionShort{get { return shortDescriptionField; }
            }

            public string DescriptionLong {get { return longDescriptionField; }
            }
}

我想返回在SearchedProductInternal课程中分配原创性的名称,但我不知道该怎么做,因为如果我只是把

return Name

我得到一个stackoverflow错误,因为它似乎只是一直在调用它自己?

5 个答案:

答案 0 :(得分:3)

我认为你应该在这里明确地实现接口,这样你就可以拥有类中定义的Name属性和接口的IProduct.Name属性。

答案 1 :(得分:1)

如果您的SearchedProductInternal已经定义了属性Name并且您尝试返回相同Name属性的值,那么您就不必做任何事情。

不要再创建一个名为Name的属性。只需删除您添加的Name属性即可。一切都应该有效,因为该类已经实现了接口IProduct定义的契约。

如果您想从IProduct.Name属性返回不同的值,可以使用explicit interface implementation

答案 2 :(得分:0)

在这种情况下,您必须更改变量的名称。

如果这是一个暧昧的句子,那么记住它对于PC来说是一样的。名字不能是两件事。但是Name和_Name可以。

public class SearchedProductInternal : IProduct
{
    string _name = "test";
    public string Name
    {
        get
        {
            return _name;
        }
    }
}
public interface IProduct
{
    string Name { get; }
}

答案 3 :(得分:0)

我同意上述答案。但这里是一个小问题,我们不能将接口成员公开为public,因为它会导致编译错误。

我们可以同时拥有类级别和接口级别成员。使用类实例无法访问接口成员,只能通过接口实例访问它。

public interface IProduct
{
    string Name { get; }
    string ID { get; }
    string DescriptionShort { get; }
    string DescriptionLong { get; }
}

public partial class SearchedProductInternal : IProduct
{
    private string _clsName;

    private string _interfaceName;
    private string _objectID;
    private string _shortDesc;
    private string _longDesc;

    public SearchedProductInternal(string _cName, string _iName)
    {
        _clsName = _cName;
        _interfaceName = _iName;
    }

    public string Name
    {
        get { return _clsName; }
    }

    string IProduct.Name
    {
        get { return _interfaceName; }
    }

    string IProduct.ID
    {
        get { return _objectID; }
    }

    string IProduct.DescriptionShort
    {
        get { return _shortDesc; }
    }

    string IProduct.DescriptionLong
    {
        get { return _longDesc; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        SearchedProductInternal clsSearchProduct = new SearchedProductInternal("clsName", "interfaceName");
        Console.WriteLine(clsSearchProduct.Name);

        IProduct interfaceProduct = (IProduct)clsSearchProduct;
        Console.WriteLine(interfaceProduct.Name);

        Console.ReadLine();
    }
}

答案 4 :(得分:0)

我不确定我是否只是以一种不被理解的方式解释了这一点,但我实现这一点的方式只是使用{get; set;}

public partial class SearchedProductInternal : IProduct
    {

        public string ID
        {
            get { return ObjectIdField.ToString(); }
        }
        public string Name  {get;set;}

        public string DescriptionShort{get { return shortDescriptionField; }
        }

        public string DescriptionLong {get { return longDescriptionField; }
        }

}