我的应用程序中有以下代码。
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属性。
我知道使用接口可以实现多重继承。但我需要在基类中定义属性,该属性在接口中受到限制。
我怎么能做到这一点?
答案 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; }
}