如何在C#中实现多重继承?

时间:2013-07-04 12:59:56

标签: c# .net inheritance interface

我的应用程序中有以下代码。

public class GeneralInfo
        {
            private string _id;
            private string _name;           

            public string id
            {
                set
                {
                    _id = value;
                }
                get
                {
                    return _id;
                }
            }

            public string name
            {
                set
                {
                    _name = value;
                }
                get
                {
                    return _name;
                }
            }

        }

       public class SecureInfo
       {
           private string _password;

           public string password
           {
               set
               {
                   _password = value;
               }
               get
               {
                   return _password;
               }
           }

       }


public class User
{
}

我需要在上面的代码中应用多重继承,即。应该可以在用户类中访问类GeneralInfo,SecureInfo属性。

我知道使用接口可以实现多重继承。但我需要在基类中定义属性,该属性在接口中受到限制。

我怎么能做到这一点?

7 个答案:

答案 0 :(得分:5)

C#不支持多重继承。但是,您可以通过多个接口实现此目的。

public interface ISecureInfo 
{

}

public interface IGeneralInfo 
{

} 

public class UserClass : ISecureInfo, IGeneralInfo {

}

答案 1 :(得分:1)

您可能最好将数据封装在类中,而不是尝试使用某些东西来执行多重继承。有关此问题,请参阅this question

答案 2 :(得分:1)

您可以通过基于接口的继承实现此目的:

public interface IGeneralInfo 
{
    String Id { get; set; }
    String Name { get; set; }
}

public interface ISecureInfo
    String Password { get; set; }
}


public class User : IGeneralInfo, ISecureInfo
{
    // Implementation of IGeneralInfo
    public String Id { get; set; }
    public String Name { get; set; }

    // Implementation of ISecureInfo
    public String Password { get; set; }
}

或者,更进一步,通过作文:

public interface IGeneralInfo 
{
    String Id { get; set; }
    String Name { get; set; }
}

public class GeneralInfo : IGeneralInfo
{
    public String Id { get; set; }
    public String Name { get; set; }
}

public interface ISecureInfo
    String Password { get; set; }
}

public class SecureInfo : IGeneralInfo
{
    public String Password { get; set; }
}

public class User : IGeneralInfo, ISecureInfo
{
    private GeneralInfo generalInfo = new GeneralInfo();
    private SecureInfo secureInfo = new SecureInfo();

    public String Id { 
        get { return generalInfo.Id; }
        set { generalInfo.Id = value; } 
    }
    public String Name { 
        get { return generalInfo.Name; }
        set { generalInfo.Name = value; } 
    }

    public String Password { 
        get { return secureInfo.Password; }
        set { secureInfo.Password = value; } 
    }
}

答案 3 :(得分:0)

您无法在C#中执行多重继承,因为它不像C ++那样受支持。在C#中,您可以使用接口并实现方法和属性。对于示例,您可以使用基类

public abstract class Entity
{
    public string Name { get; set; }

}

你也可以有一些接口:

public interface IPrint
{
   void Print();
}

public interface IGenerate
{
   void Generate();
}

并像多次继承一样使用它(但它不是,它只是一个继承和接口)

public class User : Entity, IPrint, IGenerate
{
   public void Print()
   {
     // some code
     // here you could access Name property, because it is on base class Entity
   } 

   public void Generate()
   {
     // some code
   } 
}

你可以使用抽象来实例化它:

Entity e = new User();
IPrint p = new User();
IGenerate g = new User();
User u = new User();

如果你需要实现,你可以做一个hiearachy继承,对于样本:

用户从继承自Entity的Person继承。

public class Entity
{
   public int Id { get; set; }


   public void Method()
   {
      // some code
   }
}

public class Person : Entity
{
   public string Name { get; set; }

   public void AnotherMethod()
   {
      // some code
   }
}

public class User : Person
{
   public string Password { get; set; }

   public bool CheckUser(string name, string passworkd)
   {
      // some code
   }
}

答案 4 :(得分:0)

从您的示例说明中,封装可能是您可能想要使用的内容:

public class Info{
    GeneralInfo general;
    SecureInfo secure;
...
}

答案 5 :(得分:0)

我认为最好的方法是分离接口的实现和最后的真实类。 我的意思是像桥模式。 你的类(将实现几个接口)只是将方法调用删除到真正的实现,你可以在一个单独的地方只有一次。

答案 6 :(得分:0)

您也可以使用这样的方法。与使用多重继承相比,你会得到同样的观点。这样,如果您不需要SecureInfo(即用于书籍和其他内容),您只能继承Entity。不过,我认为在这种情况下,组合会做得更好,正如其他人所说的那样......

class User : SecuredEntity { }

abstract class SecuredEntity : Entity, ISecureInfo
{
    public string Password { get; set; }
}

abstract class Entity : IGeneralInfo
{
    public string ID { get; set; }
    public string Name { get; set; }
}

interface IGeneralInfo
{
    string ID { get; set; }
    string Name { get; set; }
}

interface ISecureInfo
{
    string Password { get; set; }
}